diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/404.html b/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
+

404

+

The ScyllaDB monster ate your page!

+

+ Home +

+
+ + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/check-solid.svg b/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/clipboard.min.js b/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/_static/copybutton.css b/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/_static/copybutton.js b/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/_static/copybutton_funcs.js b/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/_static/css/main.css b/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/_static/file.png differ diff --git a/_static/img/banner-background.svg b/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_static/img/favicon-228x228.png b/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/_static/img/favicon-228x228.png differ diff --git a/_static/img/favicon-32x32.png b/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/_static/img/favicon-32x32.png differ diff --git a/_static/img/favicon.ico b/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/_static/img/favicon.ico differ diff --git a/_static/img/icons/icon-about-team.svg b/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/_static/img/icons/icon-about-us-m.svg b/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-about-us.svg b/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-alternator.svg b/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-apps.svg b/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-architecture.svg b/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/_static/img/icons/icon-benchmarks.svg b/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/_static/img/icons/icon-blog.svg b/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/_static/img/icons/icon-careers.svg b/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/_static/img/icons/icon-chevron-left.svg b/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/icons/icon-chevron-right.svg b/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/icons/icon-circe.svg b/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-clock.svg b/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-close.svg b/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/_static/img/icons/icon-cloud-docs.svg b/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-cloud.svg b/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-comparison.svg b/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/_static/img/icons/icon-contact-us.svg b/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/_static/img/icons/icon-developers-blog.svg b/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/_static/img/icons/icon-docs.svg b/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/_static/img/icons/icon-enterprise-m.svg b/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/img/icons/icon-enterprise.svg b/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-events.svg b/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/_static/img/icons/icon-exclamation.svg b/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_static/img/icons/icon-expand.svg b/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/_static/img/icons/icon-forum.svg b/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-getting-started.svg b/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-glossary.svg b/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-home.svg b/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-infoworld.svg b/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/_static/img/icons/icon-integrations.svg b/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-knowledge-base.svg b/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-less.svg b/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_static/img/icons/icon-live-test.svg b/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/_static/img/icons/icon-mail-list.svg b/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-manager.svg b/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/_static/img/icons/icon-memory-management.svg b/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/_static/img/icons/icon-modeling.svg b/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-monitoring.svg b/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/_static/img/icons/icon-networking.svg b/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/_static/img/icons/icon-news.svg b/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/_static/img/icons/icon-newsletter.svg b/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/_static/img/icons/icon-nsql-guides.svg b/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/_static/img/icons/icon-open-source.svg b/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/_static/img/icons/icon-operator.svg b/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-overview.svg b/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/_static/img/icons/icon-partners.svg b/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/_static/img/icons/icon-plus.svg b/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/_static/img/icons/icon-pricing.svg b/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/_static/img/icons/icon-release-notes.svg b/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/_static/img/icons/icon-resource-center.svg b/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/_static/img/icons/icon-roadmap.svg b/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/_static/img/icons/icon-search.svg b/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/img/icons/icon-slack.svg b/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-stack-overflow.svg b/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_static/img/icons/icon-summit.svg b/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/_static/img/icons/icon-support.svg b/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/_static/img/icons/icon-tech-talks.svg b/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/_static/img/icons/icon-testing.svg b/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/_static/img/icons/icon-thumbs-down.svg b/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-thumbs-up.svg b/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/img/icons/icon-tip.svg b/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/_static/img/icons/icon-training.svg b/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/_static/img/icons/icon-triangle-down.svg b/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/icons/icon-university.svg b/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/_static/img/icons/icon-users-blog.svg b/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/_static/img/icons/icon-warning.svg b/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/_static/img/icons/icon-webinars.svg b/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/_static/img/icons/icon-whitepapers.svg b/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/_static/img/icons/icon-workshop.svg b/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/_static/img/logo-docs.svg b/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/img/logo-scylla-horizontal-RGB.svg b/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/img/mascots/404.jpg b/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/_static/img/mascots/404.jpg differ diff --git a/_static/img/mascots/scylla-3monsters.png b/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/_static/img/mascots/scylla-3monsters.png differ diff --git a/_static/img/mascots/scylla-advisor-crystal.png b/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/_static/img/mascots/scylla-alternator.svg b/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/_static/img/mascots/scylla-cloud.svg b/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/_static/img/mascots/scylla-computer-3-monsters.png b/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/_static/img/mascots/scylla-computer-headset.png b/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/_static/img/mascots/scylla-computer-headset.png differ diff --git a/_static/img/mascots/scylla-cup-number-one.png b/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/_static/img/mascots/scylla-docs.svg b/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/_static/img/mascots/scylla-drivers.svg b/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/_static/img/mascots/scylla-enterprise.svg b/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/_static/img/mascots/scylla-forklift-boxes.png b/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/_static/img/mascots/scylla-forklift-migration.png b/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/_static/img/mascots/scylla-gear.png b/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/_static/img/mascots/scylla-gear.png differ diff --git a/_static/img/mascots/scylla-hardhat.png b/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/_static/img/mascots/scylla-hardhat.png differ diff --git a/_static/img/mascots/scylla-headband.png b/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/_static/img/mascots/scylla-headband.png differ diff --git a/_static/img/mascots/scylla-headset.png b/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/_static/img/mascots/scylla-headset.png differ diff --git a/_static/img/mascots/scylla-hearts.png b/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/_static/img/mascots/scylla-hearts.png differ diff --git a/_static/img/mascots/scylla-looking-down.png b/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/_static/img/mascots/scylla-looking-down.png differ diff --git a/_static/img/mascots/scylla-looking-up.png b/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/_static/img/mascots/scylla-looking-up.png differ diff --git a/_static/img/mascots/scylla-magnifying-glass-fronting.png b/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/_static/img/mascots/scylla-magnifying-glass.png b/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/_static/img/mascots/scylla-manager.svg b/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/_static/img/mascots/scylla-monitor.svg b/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/_static/img/mascots/scylla-movement-fast.png b/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/_static/img/mascots/scylla-movement-fast.png differ diff --git a/_static/img/mascots/scylla-movement.png b/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/_static/img/mascots/scylla-movement.png differ diff --git a/_static/img/mascots/scylla-onpremise.png b/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/_static/img/mascots/scylla-onpremise.png differ diff --git a/_static/img/mascots/scylla-opensource.svg b/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/_static/img/mascots/scylla-operator.svg b/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/_static/img/mascots/scylla-plugin.png b/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/_static/img/mascots/scylla-plugin.png differ diff --git a/_static/img/mascots/scylla-release-mascot.png b/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/_static/img/mascots/scylla-release-mascot.png differ diff --git a/_static/img/mascots/scylla-repair.png b/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/_static/img/mascots/scylla-repair.png differ diff --git a/_static/img/mascots/scylla-server.png b/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/_static/img/mascots/scylla-server.png differ diff --git a/_static/img/mascots/scylla-sleeping.png b/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/_static/img/mascots/scylla-sleeping.png differ diff --git a/_static/img/mascots/scylla-tall-measure.png b/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/_static/img/mascots/scylla-tall-measure.png differ diff --git a/_static/img/mascots/scylla-university.png b/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/_static/img/mascots/scylla-university.png differ diff --git a/_static/img/mascots/scylla-weights.png b/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/_static/img/mascots/scylla-weights.png differ diff --git a/_static/img/mascots/scylla-window-cleaning.png b/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/_static/img/mascots/scylla-with-computer-2.png b/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/_static/img/mascots/scylla-with-computer.png b/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/_static/img/mascots/scylla-with-computer.png differ diff --git a/_static/img/mascots/scylla-with-linux.png b/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/_static/img/mascots/scylla-with-linux.png differ diff --git a/_static/img/mascots/scylla-writting.png b/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/_static/img/mascots/scylla-writting.png differ diff --git a/_static/img/menu.svg b/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/_static/img/scylla-monitor.png b/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/_static/img/scylla-monitor.png differ diff --git a/_static/js/main.bundle.js b/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
  • Back
  • ',backButtonPosition:"top",wrapper:"
    ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
      "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
      ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
      ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
      ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
      ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      +
      + Menu +
      +
      +
      +
      +
      + + +
      +

      Caution

      +

      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

      +
      + + + +
      + +
      + +

      Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

      + + +
      + + + + + +
      + + +
      + +
      + +
      + + + + +
      + + + + + + + \ No newline at end of file diff --git a/branch-3.10/_images/1.png b/branch-3.10/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.10/_images/1.png differ diff --git a/branch-3.10/_images/2.png b/branch-3.10/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.10/_images/2.png differ diff --git a/branch-3.10/_images/3.png b/branch-3.10/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.10/_images/3.png differ diff --git a/branch-3.10/_images/advisor_panel.png b/branch-3.10/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.10/_images/advisor_panel.png differ diff --git a/branch-3.10/_images/alertmanager.png b/branch-3.10/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.10/_images/alertmanager.png differ diff --git a/branch-3.10/_images/cql_optimization_master.png b/branch-3.10/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.10/_images/cql_optimization_master.png differ diff --git a/branch-3.10/_images/grafana.png b/branch-3.10/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.10/_images/grafana.png differ diff --git a/branch-3.10/_images/monitor.png b/branch-3.10/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-3.10/_images/monitor.png differ diff --git a/branch-3.10/_images/monitoring_stack.png b/branch-3.10/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.10/_images/monitoring_stack.png differ diff --git a/branch-3.10/_images/monitoring_stack1.png b/branch-3.10/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-3.10/_images/monitoring_stack1.png differ diff --git a/branch-3.10/_sources/_common/monitor-description.rst.txt b/branch-3.10/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.10/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.10/_sources/index.rst.txt b/branch-3.10/_sources/index.rst.txt new file mode 100644 index 000000000..9233bc21d --- /dev/null +++ b/branch-3.10/_sources/index.rst.txt @@ -0,0 +1,42 @@ +======================== +Scylla Monitoring Stack +======================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `Scylla Monitoring Stack lesson `_ on Scylla University +* `Scylla Monitoring Stack GitHub Project `_ + +For older versions of Scylla Monitoring Stack Documentation see `here `_. \ No newline at end of file diff --git a/branch-3.10/_sources/install/docker_compose.rst.txt b/branch-3.10/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.10/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.10/_sources/install/index.rst.txt b/branch-3.10/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-3.10/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-3.10/_sources/install/min-prod-hw.rst.txt b/branch-3.10/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..443638374 --- /dev/null +++ b/branch-3.10/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,32 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. diff --git a/branch-3.10/_sources/install/monitor_without_docker.rst.txt b/branch-3.10/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..08b771b73 --- /dev/null +++ b/branch-3.10/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-3.10/_sources/install/monitoring_stack.rst.txt b/branch-3.10/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..b6fc40231 --- /dev/null +++ b/branch-3.10/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,380 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API `_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker ` . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.10/_sources/install/start_all.rst.txt b/branch-3.10/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..574e6861c --- /dev/null +++ b/branch-3.10/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.10/_sources/install/thanos.rst.txt b/branch-3.10/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-3.10/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-3.10/_sources/intro.rst.txt b/branch-3.10/_sources/intro.rst.txt new file mode 100644 index 000000000..8bad4d48a --- /dev/null +++ b/branch-3.10/_sources/intro.rst.txt @@ -0,0 +1,49 @@ +======================= +Scylla Monitoring Stack +======================= + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the `node_exporter` agent that runs on the Scylla server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-3.10/_sources/procedures/alerts/alerting.rst.txt b/branch-3.10/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.10/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.10/_sources/procedures/alerts/index.rst.txt b/branch-3.10/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-3.10/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-3.10/_sources/procedures/index.rst.txt b/branch-3.10/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-3.10/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-3.10/_sources/procedures/updating_dashboard.rst.txt b/branch-3.10/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-3.10/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.10/_sources/reference/index.rst.txt b/branch-3.10/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-3.10/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-3.10/_sources/reference/matrix.rst.txt b/branch-3.10/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..543acab4c --- /dev/null +++ b/branch-3.10/_sources/reference/matrix.rst.txt @@ -0,0 +1,115 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.10/_sources/reference/monitoring_apis.rst.txt b/branch-3.10/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-3.10/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.10/_sources/troubleshooting/index.rst.txt b/branch-3.10/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-3.10/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-3.10/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-3.10/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..a2e14a1f4 --- /dev/null +++ b/branch-3.10/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,221 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.10/_sources/upgrade/index.rst.txt b/branch-3.10/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..f4d76733b --- /dev/null +++ b/branch-3.10/_sources/upgrade/index.rst.txt @@ -0,0 +1,39 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
      +
      +
      +
      Upgrade Scylla Open Source
      +
      +
      + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
      +
      +
      diff --git a/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade
      ` +* `Prometheus Migration `_ diff --git a/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-3.10/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-3.10/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-3.10/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..2454af1d4 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,13 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +Scylla runs compaction periodically as a background process. While running compaction is important, there are situations that +the compaction takes too much CPU. +In those cases the compaction would impact the overall system performance. + +When facing this problem, you can statically limit the compaction shares with one of two options: + +1. Change ``scylla.yml`` to have ``compaction_static_shares: 100`` + +or + +2. Start scylla with ``--compaction-static-shares 100`` \ No newline at end of file diff --git a/branch-3.10/_sources/use-monitoring/advisor/index.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-3.10/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-3.10/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-3.10/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-3.10/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-3.10/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-3.10/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-3.10/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-3.10/_sources/use-monitoring/cql_optimization.rst.txt b/branch-3.10/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.10/_sources/use-monitoring/index.rst.txt b/branch-3.10/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-3.10/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-3.10/_static/basic.css b/branch-3.10/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.10/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.10/_static/check-solid.svg b/branch-3.10/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.10/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.10/_static/clipboard.min.js b/branch-3.10/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.10/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.10/_static/copybutton.css b/branch-3.10/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.10/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

      Short

      + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.10/_static/copybutton.js b/branch-3.10/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.10/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.10/_static/copybutton_funcs.js b/branch-3.10/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.10/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.10/_static/css/main.css b/branch-3.10/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-3.10/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.10/_static/doctools.js b/branch-3.10/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.10/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.10/_static/documentation_options.js b/branch-3.10/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-3.10/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.10/_static/file.png b/branch-3.10/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.10/_static/file.png differ diff --git a/branch-3.10/_static/img/banner-background.svg b/branch-3.10/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.10/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.10/_static/img/favicon-228x228.png b/branch-3.10/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.10/_static/img/favicon-228x228.png differ diff --git a/branch-3.10/_static/img/favicon-32x32.png b/branch-3.10/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.10/_static/img/favicon-32x32.png differ diff --git a/branch-3.10/_static/img/favicon.ico b/branch-3.10/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.10/_static/img/favicon.ico differ diff --git a/branch-3.10/_static/img/icons/icon-about-team.svg b/branch-3.10/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.10/_static/img/icons/icon-about-us-m.svg b/branch-3.10/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-about-us.svg b/branch-3.10/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-alternator.svg b/branch-3.10/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-apps.svg b/branch-3.10/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-architecture.svg b/branch-3.10/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.10/_static/img/icons/icon-benchmarks.svg b/branch-3.10/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.10/_static/img/icons/icon-blog.svg b/branch-3.10/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.10/_static/img/icons/icon-careers.svg b/branch-3.10/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.10/_static/img/icons/icon-chevron-left.svg b/branch-3.10/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.10/_static/img/icons/icon-chevron-right.svg b/branch-3.10/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.10/_static/img/icons/icon-circe.svg b/branch-3.10/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-clock.svg b/branch-3.10/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-close.svg b/branch-3.10/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-cloud-docs.svg b/branch-3.10/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-cloud.svg b/branch-3.10/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-comparison.svg b/branch-3.10/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.10/_static/img/icons/icon-contact-us.svg b/branch-3.10/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.10/_static/img/icons/icon-developers-blog.svg b/branch-3.10/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.10/_static/img/icons/icon-docs.svg b/branch-3.10/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.10/_static/img/icons/icon-enterprise-m.svg b/branch-3.10/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-enterprise.svg b/branch-3.10/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-events.svg b/branch-3.10/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.10/_static/img/icons/icon-exclamation.svg b/branch-3.10/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-expand.svg b/branch-3.10/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-forum.svg b/branch-3.10/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-getting-started.svg b/branch-3.10/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-glossary.svg b/branch-3.10/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-home.svg b/branch-3.10/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-infoworld.svg b/branch-3.10/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.10/_static/img/icons/icon-integrations.svg b/branch-3.10/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-knowledge-base.svg b/branch-3.10/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-less.svg b/branch-3.10/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-live-test.svg b/branch-3.10/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.10/_static/img/icons/icon-mail-list.svg b/branch-3.10/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-manager.svg b/branch-3.10/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.10/_static/img/icons/icon-memory-management.svg b/branch-3.10/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.10/_static/img/icons/icon-modeling.svg b/branch-3.10/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-monitoring.svg b/branch-3.10/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.10/_static/img/icons/icon-networking.svg b/branch-3.10/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.10/_static/img/icons/icon-news.svg b/branch-3.10/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.10/_static/img/icons/icon-newsletter.svg b/branch-3.10/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.10/_static/img/icons/icon-nsql-guides.svg b/branch-3.10/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.10/_static/img/icons/icon-open-source.svg b/branch-3.10/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.10/_static/img/icons/icon-operator.svg b/branch-3.10/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-overview.svg b/branch-3.10/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.10/_static/img/icons/icon-partners.svg b/branch-3.10/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.10/_static/img/icons/icon-plus.svg b/branch-3.10/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-pricing.svg b/branch-3.10/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.10/_static/img/icons/icon-release-notes.svg b/branch-3.10/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.10/_static/img/icons/icon-resource-center.svg b/branch-3.10/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.10/_static/img/icons/icon-roadmap.svg b/branch-3.10/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.10/_static/img/icons/icon-search.svg b/branch-3.10/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.10/_static/img/icons/icon-slack.svg b/branch-3.10/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-stack-overflow.svg b/branch-3.10/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.10/_static/img/icons/icon-summit.svg b/branch-3.10/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/icons/icon-support.svg b/branch-3.10/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.10/_static/img/icons/icon-tech-talks.svg b/branch-3.10/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.10/_static/img/icons/icon-testing.svg b/branch-3.10/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.10/_static/img/icons/icon-thumbs-down.svg b/branch-3.10/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-thumbs-up.svg b/branch-3.10/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.10/_static/img/icons/icon-tip.svg b/branch-3.10/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.10/_static/img/icons/icon-training.svg b/branch-3.10/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.10/_static/img/icons/icon-triangle-down.svg b/branch-3.10/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.10/_static/img/icons/icon-university.svg b/branch-3.10/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.10/_static/img/icons/icon-users-blog.svg b/branch-3.10/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.10/_static/img/icons/icon-warning.svg b/branch-3.10/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.10/_static/img/icons/icon-webinars.svg b/branch-3.10/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.10/_static/img/icons/icon-whitepapers.svg b/branch-3.10/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.10/_static/img/icons/icon-workshop.svg b/branch-3.10/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.10/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.10/_static/img/logo-docs.svg b/branch-3.10/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.10/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.10/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.10/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.10/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.10/_static/img/mascots/404.jpg b/branch-3.10/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.10/_static/img/mascots/404.jpg differ diff --git a/branch-3.10/_static/img/mascots/scylla-3monsters.png b/branch-3.10/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.10/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-alternator.svg b/branch-3.10/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.10/_static/img/mascots/scylla-cloud.svg b/branch-3.10/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.10/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.10/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-computer-headset.png b/branch-3.10/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-cup-number-one.png b/branch-3.10/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-docs.svg b/branch-3.10/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.10/_static/img/mascots/scylla-drivers.svg b/branch-3.10/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.10/_static/img/mascots/scylla-enterprise.svg b/branch-3.10/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.10/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.10/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-forklift-migration.png b/branch-3.10/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-gear.png b/branch-3.10/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-hardhat.png b/branch-3.10/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-headband.png b/branch-3.10/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-headset.png b/branch-3.10/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-hearts.png b/branch-3.10/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-looking-down.png b/branch-3.10/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-looking-up.png b/branch-3.10/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.10/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.10/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-manager.svg b/branch-3.10/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.10/_static/img/mascots/scylla-monitor.svg b/branch-3.10/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.10/_static/img/mascots/scylla-movement-fast.png b/branch-3.10/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-movement.png b/branch-3.10/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-onpremise.png b/branch-3.10/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-opensource.svg b/branch-3.10/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.10/_static/img/mascots/scylla-operator.svg b/branch-3.10/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.10/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.10/_static/img/mascots/scylla-plugin.png b/branch-3.10/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-release-mascot.png b/branch-3.10/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-repair.png b/branch-3.10/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-server.png b/branch-3.10/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-sleeping.png b/branch-3.10/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-tall-measure.png b/branch-3.10/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-university.png b/branch-3.10/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-weights.png b/branch-3.10/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-window-cleaning.png b/branch-3.10/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-with-computer-2.png b/branch-3.10/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-with-computer.png b/branch-3.10/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-with-linux.png b/branch-3.10/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.10/_static/img/mascots/scylla-writting.png b/branch-3.10/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.10/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.10/_static/img/menu.svg b/branch-3.10/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.10/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.10/_static/img/scylla-monitor.png b/branch-3.10/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.10/_static/img/scylla-monitor.png differ diff --git a/branch-3.10/_static/js/main.bundle.js b/branch-3.10/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-3.10/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
    • Back
    • ',backButtonPosition:"top",wrapper:"
      ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
        "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
        ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
        ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
        ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
        ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
        "],col:[2,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + + + +
        + + + + + +
        + + +
        + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/index.html b/branch-3.10/index.html new file mode 100644 index 000000000..448c9ed60 --- /dev/null +++ b/branch-3.10/index.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack

        +
        +
        +

        Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

        +_images/monitor.png +

        The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

        +
          +
        • prometheus - collects and stores metrics

        • +
        • alertmanager - handles alerts

        • +
        • grafana - dashboard server

        • +
        +

        Choose a topic to get started:

        + +

        For older versions of Scylla Monitoring Stack Documentation see here.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/docker_compose.html b/branch-3.10/install/docker_compose.html new file mode 100644 index 000000000..5288509e9 --- /dev/null +++ b/branch-3.10/install/docker_compose.html @@ -0,0 +1,801 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Using Docker Compose

        +

        Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

        +

        Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

        +
        +

        Warning

        +

        docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

        +
        +
        +

        Prerequisite

        +

        Make sure you have docker and docker-compose installed.

        +
        +
        +

        Setting Prometheus

        +

        The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

        +

        You can use ./prometheus-config.sh to generate the file, for example:

        +
        ./prometheus-config.sh --compose
        +
        +
        +

        For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

        +
        +
        +

        Setting Grafana Provisioning

        +

        Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

        +
        +

        Grafana Data-Source file

        +

        Run the following command to update the datasource:

        +
        ./grafana-datasource.sh --compose
        +
        +
        +

        You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

        +
        +
        +

        Grafana Dashboard Load file

        +

        To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

        +
        ./generate-dashboards.sh -t -v 2020.1
        +
        +
        +

        This command generates the files under: grafana/provisioning/dashboards/

        +
        +
        +
        +

        Docker Compose file

        +

        You can use the following example as a base for your docker compose.

        +

        Pass the following to a file called docker-compose.yml

        +
        services:
        +  alertmanager:
        +    container_name: aalert
        +    image: prom/alertmanager:v0.21.0
        +    ports:
        +    - 9093:9093
        +    volumes:
        +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
        +  grafana:
        +    container_name: agraf
        +    environment:
        +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
        +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
        +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
        +    # This is where you set Grafana security
        +    - GF_AUTH_BASIC_ENABLED=false
        +    - GF_AUTH_ANONYMOUS_ENABLED=true
        +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
        +    - GF_SECURITY_ADMIN_PASSWORD=admin
        +    image: grafana/grafana:7.3.5
        +    ports:
        +    - 3000:3000
        +    user: 1000:1000
        +    volumes:
        +    - ./grafana/build:/var/lib/grafana/dashboards
        +    - ./grafana/plugins:/var/lib/grafana/plugins
        +    - ./grafana/provisioning:/var/lib/grafana/provisioning
        +    # Uncomment the following line for grafana persistency
        +    # - path/to/grafana/dir:/var/lib/grafana
        +  loki:
        +    command:
        +    - --config.file=/mnt/config/loki-config.yaml
        +    container_name: loki
        +    image: grafana/loki:2.0.0
        +    ports:
        +    - 3100:3100
        +    volumes:
        +    - ./loki/rules:/etc/loki/rules
        +    - ./loki/conf:/mnt/config
        +  promotheus:
        +    command:
        +    - --config.file=/etc/prometheus/prometheus.compose.yml
        +    container_name: aprom
        +    image: prom/prometheus:v2.18.1
        +    ports:
        +    - 9090:9090
        +    volumes:
        +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
        +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
        +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
        +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
        +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
        +    # Uncomment the following line for prometheus persistency 
        +    # - path/to/data/dir:/prometheus/data
        +  promtail:
        +    command:
        +    - --config.file=/etc/promtail/config.yml
        +    container_name: promtail
        +    image: grafana/promtail:2.0.0
        +    ports:
        +    - 1514:1514
        +    - 9080:9080
        +    volumes:
        +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
        +version: '3'
        +
        +
        +
        +

        Start and Stop

        +

        To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/index.html b/branch-3.10/install/index.html new file mode 100644 index 000000000..4ee29bb7c --- /dev/null +++ b/branch-3.10/install/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Download and Install Scylla Monitoring Stack

        +
        +
        +

        Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

        +

        Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/min-prod-hw.html b/branch-3.10/install/min-prod-hw.html new file mode 100644 index 000000000..2affd64df --- /dev/null +++ b/branch-3.10/install/min-prod-hw.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Minimal Production System Recommendations

        +
          +
        • CPU - at least 2 physical cores/ 4vCPUs

        • +
        • Memory - 15GB+ DRAM and proportional to the number of cores.

        • +
        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

        • +
        • Network - 1GbE/10GbE preferred

        • +
        +
        +

        Calculating Prometheus Minimal Disk Space requirement

        +

        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

        +

        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

        +

        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

        +
        6 * 16 * 15 * 12MB ~ 16GB
        +
        +
        +

        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

        +
        +
        +

        Calculating Prometheus Minimal Memory Space requirement

        +

        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

        +

        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/monitor_without_docker.html b/branch-3.10/install/monitor_without_docker.html new file mode 100644 index 000000000..ed05b376e --- /dev/null +++ b/branch-3.10/install/monitor_without_docker.html @@ -0,0 +1,1107 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Deploying Scylla Monitoring Stack Without Docker

        +
        +

        Introduction

        +

        The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

        +

        Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

        +

        Scylla Monitoring uses the following components:

        +
          +
        • Alertmanager

        • +
        • Grafana Loki

        • +
        • Prometheus

        • +
        • Grafana

        • +
        +

        The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

        +

        We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

        +
        +
        +

        Minimal Production System Recommendations

        +
          +
        • CPU - at least 2 physical cores/ 4vCPUs

        • +
        • Memory - 15GB+ DRAM and proportional to the number of cores.

        • +
        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

        • +
        • Network - 1GbE/10GbE preferred

        • +
        +
        +

        Calculating Prometheus Minimal Disk Space requirement

        +

        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

        +

        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

        +

        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

        +
        6 * 16 * 15 * 12MB ~ 16GB
        +
        +
        +

        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

        +
        +
        +

        Calculating Prometheus Minimal Memory Space requirement

        +

        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

        +

        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

        +

        The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

        +
        +

        Note

        +

        Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

        +
        +
        +
        +
        +

        Install Scylla Monitoring Stack

        +

        The following procedure uses a CentOS 7 based instance

        +
          +
        1. Download the latest Scylla Monitoring Stack release.

        2. +
        +
        wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.10.1.tar.gz
        +
        +
        +
          +
        1. Open the tar

        2. +
        +

        tar -xvf scylla-monitoring-*.tar.gz

        +
        +
        +

        Install Alertmanager

        +

        Tested with alertmanager 0.22.2 version

        +
          +
        1. Install alertmanager

        2. +
        +
        wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
        +tar -xvf alertmanager-*.linux-amd64.tar.gz
        +
        +
        +
          +
        1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

        2. +
        +

        For example:

        +
        cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.10.1/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
        +
        +
        +
          +
        1. Start the Alertmanager

        2. +
        +

        For example:

        +
        cd alertmanager-0.22.2.linux-amd64
        +./alertmanager
        +
        +
        +
          +
        1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

        2. +
        +

        For example:

        +
        http://192.168.135.166:9093/
        +
        +
        +../_images/alertmanager.png +
        +
        +

        Install Grafana Loki

        +

        Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

        +

        We recomand using Loki with containers, but you can install it locally as described in Loki installation

        +

        You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

        +

        Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

        +

        Loki Related files

        +

        Loki has a configuration file and a rule file. You need to copy and modify the configuration.

        +
        mkdir -p /etc/loki/rules
        +mkdir -p /etc/loki/config
        +cp loki/rules/* /etc/loki/rules
        +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
        +
        +
        +

        Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

        +

        Promtail Related files

        +

        Promtail has a configuration file. You need to copy and modify the configuration.

        +
        mkdir -p /etc/promtail/
        +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
        +
        +
        +

        Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

        +
        +
        +

        Install Prometheus

        +

        Tested with Prometheus version 2.27.1

        +
        +

        Note

        +

        If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

        +
        +
          +
        1. Install Prometheus

        2. +
        +
        wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
        +tar -xvf prometheus-*.linux-amd64.tar.gz
        +
        +
        +

        2. Create Data and Config directories +.. code-block:: shell

        +
        +

        mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

        +
        +
          +
        1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

        2. +
        +

        Copy prometheus/prometheus.yml.template to prometheus.yml

        +

        For example:

        +
        cp scylla-monitoring-scylla-monitoring-3.10.1/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
        +cp scylla-monitoring-scylla-monitoring-3.10.1/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
        +
        +
        +
          +
        1. Edit the prometheus.yml file to point to the correct static data sources.

        2. +
        +
        +

        Note

        +

        Make sure to include the honor_labels: false parameter in the prometheus.yml file.

        +
        +
        vi /etc/prometheus/prometheus.yml
        +
        +
        +

        Set the alertmanger address and port by replacing AM_ADDRESS in the file.

        +

        For example if the alertmanager will run on the same host:

        +
        alerting:
        +   alertmanagers:
        +   - static_configs:
        +       - targets:
        +           - 127.0.0.1:9093
        +
        +
        +

        Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

        +

        For example the scrape config for Scylla:

        +
        global:
        +  scrape_interval: 5s # By default, scrape targets every 5 second.
        +  scrape_timeout: 4s # Timeout before trying to scape a target again
        +
        +  # Attach these labels to any time series or alerts when communicating with
        +  # external systems (federation, remote storage, Alertmanager).
        +  external_labels:
        +    monitor: 'scylla-monitor'
        +
        +scrape_configs:
        +- job_name: scylla
        +  honor_labels: false
        +  file_sd_configs:
        +    - files:
        +      - /etc/scylla.d/prometheus/scylla_servers.yml
        +  relabel_configs:
        +    - source_labels: [__address__]
        +      regex:  '([^:]+)'
        +      target_label: __address__
        +      replacement: '${1}:9180'
        +
        +    - source_labels: [__address__]
        +      regex:  '(.*):.+'
        +      target_label: instance
        +      replacement: '${1}'
        +
        +
        +
          +
        1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

        2. +
        +
        +

        Note

        +

        There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

        +
        +

        An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

        +
        +

        Note

        +

        You must have both files even if you are not using Scylla Manager

        +
        +

        Add the labels for the cluster and data-center

        +

        scylla_servers.yml:

        +

        For example:

        +
        cat scylla_servers.yml
        +# List Scylla end points
        +
        +- targets:
        +  - 192.168.66.6
        +  - 192.168.66.244
        +  labels:
        +    cluster: cluster1
        +    dc: dc1
        +- targets:
        +    - 172.17.0.3
        +  labels:
        +    cluster: cluster1
        +    dc: dc2
        +
        +
        +
        +

        Note

        +

        See the previous note about deprecating the node_exporter_servers.yml file.

        +
        +

        scylla_manager_server.yml

        +

        For example:

        +
        - targets:
        +  - 127.0.0.1:5090
        +
        +
        +
          +
        1. Start Prometheus server:

        2. +
        +

        For example:

        +
        cd scylla-monitoring-scylla-monitoring-3.10.1/
        +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
        +
        +
        +

        Data should start accumulate on: /prometheus/data

        +
          +
        1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

        2. +
        +

        For example:

        +
        http://192.168.135.166:9090/
        +
        +
        +../_images/1.png +

        Prometheus console should be visible

        +
          +
        1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

        2. +
        +

        For example:

        +

        node_memory_MemFree

        +../_images/2.png +

        And

        +

        scylla_reactor_utilization

        +../_images/3.png +

        At this point Scylla is emitting the metrics and Prometheus is able to store them.

        +
        +
        +

        Install Grafana

        +

        Tested with Grafna 7.5.7

        +
          +
        1. Install Grafana based on the instructions here

        2. +
        +

        Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

        +
          +
        1. Access Scylla-Grafana-monitoring directory

        2. +
        +
        cd scylla-monitoring-scylla-monitoring-3.10.1/
        +
        +
        +
          +
        1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

        2. +
        +
        sudo cp -r grafana/plugins /var/lib/grafana/
        +
        +
        +

        If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

        +

        For example:

        +
        cp -r grafana/plugins ../grafana-7.5.7/public/app
        +
        +
        +
          +
        1. Provision the Dashboards

        2. +
        +

        For example Scylla Open-source version 4.5 and Scylla manager version 2.4

        +

        For Grafana installed with yum install

        +
        sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
        +sudo mkdir -p /var/lib/grafana/dashboards
        +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
        +
        +
        +

        For Grafana installed from packages

        +
        cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
        +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
        +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
        +
        +
        +

        Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

        +
        +

        Note

        +

        A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

        +
        +
          +
        1. Set the data source by copy datasource.yml and edit it

        2. +
        +
        sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
        +
        +
        +
        +

        Note

        +

        Scylla uses a plugin to read from some system tables see the section below about using it.

        +
        +

        For Grafana installed from packages

        +
        cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
        +
        +
        +

        You should set the Prometheus and the alertmanager IP and port.

        +

        For example

        +
        sudo cat /etc/grafana/provisioning/datasources/datasource.yml
        +apiVersion: 1
        +datasources:
        + - name: prometheus
        +   type: prometheus
        +   url: http://192.168.135.167:9090
        +   access: proxy
        +   basicAuth: false
        +
        + - name: alertmanager
        +   type: camptocamp-prometheus-alertmanager-datasource
        +   orgId: 1
        +   typeLogoUrl: public/img/icn-datasource.svg
        +   access: proxy
        +   url: http://192.168.135.166:9093
        +   password:
        +   user:
        +   database:
        +   basicAuth:
        +   isDefault:
        +   jsonData:
        +     severity_critical: '4'
        +     severity_high: '3'
        +     severity_warning: '2'
        +     severity_info: '1'
        +
        +
        +
          +
        1. Start the Grafana service

        2. +
        +

        For Grafana installed with yum install

        +

        sudo service grafana-server start

        +

        For Grafana installed from packages:

        +

        cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

        +

        Edit scylla.ini to reflect the right paths in the paths section of the file.

        +
        plugins = /home/centos/grafana-7.5.7/data/plugins
        +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
        +
        +
        +

        Start the server:

        +
        cd /home/centos/grafana-7.5.7/
        +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
        +
        +
        +
          +
        1. Make sure Grafana is running

        2. +
        +

        Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

        +../_images/grafana.png +
        +
        +

        Using Scylla Plugin with Grafana

        +

        Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

        +

        Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

        +
        +

        Setting a monitoring user

        +

        This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

        +
          +
        • If you have not done so, enable authorization first.

        • +
        • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

        • +
        • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

        • +
        +
        +
        +

        Installing the Plugin

        +

        Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

        +
        +
        +

        Configure the Plugin

        +

        Add an entry to the datasource.yml file

        +
        - name: scylla-datasource
        +  type: scylladb-scylla-datasource
        +  orgId: 1
        +  isDefault:
        +  jsonData:
        +  host: ''
        +#  secureJsonData:
        +#    user: 'scylla_monitoring'
        +#    password: 'scylla_monitoring'
        +
        +
        +

        As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

        +
        +
        +

        Enable the Plugin

        +

        Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

        +

        See more about it the Grafana configurtion.

        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/monitoring_stack.html b/branch-3.10/install/monitoring_stack.html new file mode 100644 index 000000000..a877a38c7 --- /dev/null +++ b/branch-3.10/install/monitoring_stack.html @@ -0,0 +1,1013 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Install Scylla Monitoring Stack

        +

        This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

        +

        The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

        +

        For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

        +
        +

        Minimal Production System Recommendations

        +
          +
        • CPU - at least 2 physical cores/ 4vCPUs

        • +
        • Memory - 15GB+ DRAM and proportional to the number of cores.

        • +
        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

        • +
        • Network - 1GbE/10GbE preferred

        • +
        +
        +

        Calculating Prometheus Minimal Disk Space requirement

        +

        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

        +

        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

        +

        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

        +
        6 * 16 * 15 * 12MB ~ 16GB
        +
        +
        +

        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

        +
        +
        +

        Calculating Prometheus Minimal Memory Space requirement

        +

        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

        +

        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

        +
        +
        +
        +

        Prerequisites

        +
          +
        • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

        • +
        • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

        • +
        + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Scylla Monitoring Stack Compatibility Matrix

        Scylla Monitoring Stack Version

        Prometheus Version

        Grafana Version

        3.10

        2.32.0

        8.3.3

        3.9.2

        2.29.1

        8.2.7

        3.8

        2.27.1

        7.5.7

        3.7

        2.25.2

        7.4.0

        3.6

        2.18.1

        7.3.5

        3.5

        2.18.1

        7.1.5

        3.4

        2.18.1

        6.7.3

        +
        +
        +

        Docker Post Installation

        +

        Docker post installation guide can be found here

        +
        +

        Note

        +

        Avoid running the container as root.

        +
        +

        To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

        +
          +
        1. Create the Docker group.

        2. +
        +
        sudo groupadd docker
        +
        +
        +
          +
        1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

        2. +
        +
        sudo usermod -aG docker $USER
        +
        +
        +
          +
        1. Start Docker by calling:

        2. +
        +
        sudo systemctl enable docker
        +
        +
        +
        +
        +

        Install Scylla Monitoring Stack

        +

        Procedure

        +
          +
        1. Download and extract the latest Scylla Monitoring Stack binary;.

        2. +
        +
        wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.10.1.tar.gz
        +tar -xvf scylla-monitoring-3.10.1.tar.gz
        +cd scylla-monitoring-scylla-monitoring-3.10.1
        +
        +
        +

        As an alternative, you can clone and use the Git repository directly.

        +
        git clone https://github.com/scylladb/scylla-monitoring.git
        +cd scylla-monitoring
        +git checkout branch-3.10
        +
        +
        +
          +
        1. Start Docker service if needed

        2. +
        +
        sudo systemctl restart docker
        +
        +
        +
        +
        +

        Configure Scylla Monitoring Stack

        +

        To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

        +

        This configuration can be done from files, or using the Consul api.

        +

        Scylla Manager 2.0 and higher supports the Consul API.

        +
        +

        Configure Scylla nodes from files

        +
          +
        1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

        2. +
        +
        +

        Note

        +

        It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

        +
        +

        For example:

        +
        - targets:
        +      - 172.17.0.2
        +      - 172.17.0.3
        +  labels:
        +      cluster: cluster1
        +      dc: dc1
        +
        +
        +
        +

        Note

        +

        If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

        +
        +

        Using IPV6

        +

        To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

        +

        For example:

        +
        - targets:
        +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
        +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
        +  labels:
        +      cluster: cluster1
        +      dc: dc1
        +
        +
        +
        +

        Note

        +

        For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

        +
        +

        For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

        +
        +

        Note

        +

        By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

        +
        +

        If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

        +

        For example:

        +
        ./start-all.sh -s my_scylla_server.yml -d prometheus_data
        +
        +
        +

        Mark the different Data Centers with Labels.

        +

        As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

        +

        You can use the genconfig.py script to generate the server file. For example:

        +
        ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
        +
        +
        +

        This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

        +

        OR

        +

        The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

        +
        nodetool status | ./genconfig.py -NS
        +
        +
        +

        2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

        +

        You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

        +

        For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

        +
        # List Scylla Manager end points
        +
        +- targets:
        +  - 172.17.0.7:5090
        +
        +
        +

        Note that you do not need to add labels to the Scylla Manager targets.

        +
        +
        +

        Configure Scylla nodes using Scylla-Manager Consul API

        +

        Scylla Manager 2.0 has a Consul like API.

        +

        When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

        +

        For example:

        +
        ./start-all.sh -L 10.10.0.1
        +
        +
        +
        +

        Note

        +

        If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

        +
        +
        +
        +

        Connecting Scylla-Monitoring to Scylla

        +

        Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

        +

        You can limit the user to read only, currently it only read table from the system keyspace.

        +

        To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

        +

        Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

        +
        +
        +

        Use an external directory for the Prometheus data directory

        +

        The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

        +
        +

        Note

        +

        Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

        +
        +

        If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

        +

        In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

        +
        +
        +

        Add Additional Prometheus Targets

        +

        There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

        +

        The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

        +

        You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

        +
        - job_name: 'myservice'
        +  # Override the global default and scrape targets from this job every 5 seconds.
        +  scrape_interval: 5s
        +  static_configs:
        +    - targets:
        +      - 17.0.0.1:7000
        +
        +
        +
        +
        +
        +

        Start and Stop Scylla Monitoring Stack

        +
        +

        Start

        +
        ./start-all.sh -d prometheus_data
        +
        +
        +
        +
        +

        Stop

        +
        ./kill-all.sh
        +
        +
        +
        +
        +

        Start a Specific Scylla Monitoring Stack Version

        +

        By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

        +

        You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

        +

        Multiple versions are supported. For example:

        +
        ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
        +
        +
        +

        will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

        +
        +
        +

        Accessing the localhost

        +

        The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

        +
        ./start-all.sh -l -d prometheus-data
        +
        +
        +
        +
        +

        Configure rsyslog on each Scylla node

        +

        generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

        +

        Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

        +

        Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

        +

        If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

        +
        if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
        +
        +
        +

        Restart rsyslog for the configuration to take effect.

        +
        systemctl restart rsyslog
        +
        +
        +
        +
        +
        +

        View Grafana Dashboards

        +

        Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/start_all.html b/branch-3.10/install/start_all.html new file mode 100644 index 000000000..5d7001103 --- /dev/null +++ b/branch-3.10/install/start_all.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        The start-all.sh command

        +

        Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

        +

        The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

        +
        +

        General Options

        +

        -h Help, Print the help, and exit.

        +

        –version print the current Scylla-Monitoring stack version, and exit.

        +

        -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

        +

        -A bind-to-ip-address Bind the listening-address to an explicit IP address.

        +

        -D encapsulate docker param Allows passing additional parameters to all the docker containers.

        +

        –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

        +
        + + +
        +

        Alert Manager

        +

        alertmanager handles the alerts and takes the following parameters:

        +

        -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

        +

        -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

        +

        -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/install/thanos.html b/branch-3.10/install/thanos.html new file mode 100644 index 000000000..660ccf6f4 --- /dev/null +++ b/branch-3.10/install/thanos.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Using Thanos as Data Source With Scylla Monitoring Stack

        +

        Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

        +
          +
        • High-availability.

        • +
        • Horizontal scaling.

        • +
        • Backup.

        • +
        +

        The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

        +

        The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

        +
        +

        Using Thanos As a Prometheus Aggregator

        +

        There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

        +
        +

        Prometheus Configuration

        +

        We will assume you have two Prometheus servers running.

        +
          +
        1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

        2. +
        3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

        4. +
        +
        +
        +

        Thanos sidecar

        +

        The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

        +
        docker run -d \
        + -v /path/to/prom/dir:/data/prom:z \
        + -i --name sidecar thanosio/thanos \
        + sidecar \
        + --grpc-address=0.0.0.0:10911 \
        + --grpc-grace-period=1s \
        + --http-address=0.0.0.0:10912 \
        + --http-grace-period=1s \
        + --prometheus.url=http://prometheus-ip:9090 \
        + --tsdb.path=/data/prom \
        + -p 10912:10912 \
        + -p 10911:10911
        +
        +
        +

        After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

        +
        +
        +

        Thanos query

        +

        Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

        +
        docker run -d \
        + --name thanos -- thanosio/thanos \
        +   query \
        +   --debug.name=query0 \
        +   --log.level=debug \
        +   --grpc-address=0.0.0.0:10903 \
        +   --grpc-grace-period=1s \
        +   --http-address=0.0.0.0:10904 \
        +   --http-grace-period=1s \
        +   --query.replica-label=prometheus \
        +   --store={ip1}:10911 --store={ip2}:10911
        +
        +
        +

        After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

        +
        +
        +

        Update Scylla Data source

        +

        The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

        +

        The file you edit is a template file that replaces the file Grafana uses, next time you start.

        +

        Restart the Scylla Monitoring Stack it should now use Thanos.

        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/intro.html b/branch-3.10/intro.html new file mode 100644 index 000000000..e68d605ca --- /dev/null +++ b/branch-3.10/intro.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack

        +

        Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

        +_images/monitor.png +

        The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers:

        +
          +
        • prometheus - Collects and stores metrics

        • +
        • grafan-loki - Parses logs and generates metrics and alerts

        • +
        • alertmanager - Handles alerts

        • +
        • grafana - Dashboards server

        • +
        +

        A few optional components are used for additional services

        +
          +
        • grafana-image-renderer - Allows you to download a dashboard as an image.

        • +
        • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

        • +
        +
        +

        High Level Architecture

        +_images/monitoring_stack1.png +

        We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the node_exporter agent that runs on the Scylla server.

        +

        We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers.

        +

        The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

        +

        We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL.

        +

        Choose a topic to get started:

        + +

        For older versions of Scylla Monitoring Stack Documentation see here.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/objects.inv b/branch-3.10/objects.inv new file mode 100644 index 000000000..dab198fbb Binary files /dev/null and b/branch-3.10/objects.inv differ diff --git a/branch-3.10/procedures/alerts/alerting.html b/branch-3.10/procedures/alerts/alerting.html new file mode 100644 index 000000000..0565acbd7 --- /dev/null +++ b/branch-3.10/procedures/alerts/alerting.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Alerting

        +

        Alerts are a Prometheus enhancement to notify that something is wrong in the system.

        +

        You can read more about Prometheus alerting here

        +

        By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

        +

        In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

        +

        The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

        +../../_images/monitoring_stack.png +
        +

        Prometheus Alerts

        +

        The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

        +

        Each alert consists of:

        +
          +
        • Name

        • +
        • What happened

        • +
        • For how long

        • +
        • What to report

        • +
        +

        For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

        +
        - alert: InstanceDown
        +  expr: up == 0
        +  for: 60s
        +  labels:
        +    severity: "2"
        +  annotations:
        +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
        +    summary: Instance {{ $labels.instance }} down
        +
        +
        +

        The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

        +

        The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

        +

        The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

        +

        annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

        +
        +
        +

        Alertmanager

        +

        The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

        +

        The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

        +
          +
        • Routes: Represent a routing tree, the most specific rule, wins

        • +
        • Inhibition: Mute an alert, based on another alert

        • +
        • Receiver: Send a notification via email, sluck, etc’

        • +
        +

        Check the Alertmanager documentation for details on how to specify a specific receiver.

        +

        In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

        +
        +
        +

        Tips When Adding an Alert

        +

        It’s worse having an alert that does not work, than not having an alert at all

        +

        There are multiple ways you can use to make sure your alert is set correctly:

        +
          +
        • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

        • +
        • Force the alert to be active by reducing the limits or the duration.

        • +
        • When possible simulate the actual scenario and see that the alert works as expected.

        • +
        +

        For example, low available disk space.

        +

        Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

        +

        Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

        +

        Starting with a simple working expression helps you bisect problems.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/procedures/alerts/index.html b/branch-3.10/procedures/alerts/index.html new file mode 100644 index 000000000..e79d671de --- /dev/null +++ b/branch-3.10/procedures/alerts/index.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Alert Manager

        +
        +
        +

        Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/procedures/index.html b/branch-3.10/procedures/index.html new file mode 100644 index 000000000..96c98ea69 --- /dev/null +++ b/branch-3.10/procedures/index.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Procedures

        +
        +
        +

        There are several reference guides available which give additional information. Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/procedures/updating_dashboard.html b/branch-3.10/procedures/updating_dashboard.html new file mode 100644 index 000000000..e957196b8 --- /dev/null +++ b/branch-3.10/procedures/updating_dashboard.html @@ -0,0 +1,949 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Adding and Modifying Dashboards

        +

        This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

        +

        It covers dashboard templates and how to modify them.

        + +
        +

        General Limitations

        +

        Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

        +
        +

        Consistency Between Restarts

        +

        By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

        +
        +
        +

        Consistency Between Upgrades

        +

        As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

        +
        +

        Note

        +

         You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

        +
        +

        At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

        +
        +
        +
        +

        Using Templated Dashboards

        +

        Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

        +

        Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

        +

        For example a typical graph panel would look like this:

        +
        {
        +    "aliasColors": {},
        +    "bars": false,
        +    "datasource": "prometheus",
        +    "editable": true,
        +    "error": false,
        +    "fill": 0,
        +    "grid": {
        +        "threshold1": null,
        +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
        +        "threshold2": null,
        +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
        +    },
        +    "gridPos": {
        +        "h": 6,
        +        "w": 10,
        +        "x": 0,
        +        "y": 4
        +    },
        +    "id": 2,
        +    "isNew": true,
        +    "legend": {
        +        "avg": false,
        +        "current": false,
        +        "max": false,
        +        "min": false,
        +        "show": false,
        +        "total": false,
        +        "values": false
        +    },
        +    "lines": true,
        +    "linewidth": 2,
        +    "links": [],
        +    "nullPointMode": "connected",
        +    "percentage": false,
        +    "pointradius": 5,
        +    "points": false,
        +    "renderer": "flot",
        +    "seriesOverrides": [
        +        {}
        +    ],
        +    "span": 5,
        +    "stack": false,
        +    "steppedLine": false,
        +    "targets": [
        +        {
        +            "expr": "sum(node_filesystem_avail) by (instance)",
        +            "intervalFactor": 1,
        +            "legendFormat": "",
        +            "refId": "A",
        +            "step": 1
        +        }
        +    ],
        +    "timeFrom": null,
        +    "timeShift": null,
        +    "title": "Available Disk Size",
        +    "tooltip": {
        +        "msResolution": false,
        +        "shared": true,
        +        "sort": 0,
        +        "value_type": "cumulative"
        +    },
        +    "transparent": false,
        +    "type": "graph",
        +    "xaxis": {
        +        "show": true
        +    },
        +    "yaxes": [
        +        {
        +            "format": "percent",
        +            "logBase": 1,
        +            "max": 101,
        +            "min": 0,
        +            "show": true
        +        },
        +        {
        +            "format": "short",
        +            "logBase": 1,
        +            "max": null,
        +            "min": null,
        +            "show": true
        +        }
        +    ]
        +}
        +
        +
        +

        As you can imagine, most panels would have similar values.

        +

        To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

        +
        +

        The Template Class System

        +

        The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

        +

        The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

        +

        In the template file, you can also add or override attributes.

        +

        The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

        +

        When generating dashboards, each class will be replaced by its definition.

        +

        For example, a row in the type.json is defined as:

        +
        {
        + "base_row": {
        +     "collapse": false,
        +     "editable": true
        + },
        + "row": {
        +     "class": "base_row",
        +     "height": "250px"
        + }
        + }
        +
        +
        +

        Will be used like in a template:

        +
        {
        +     "class": "row",
        +     "height": "150px",
        +     "panels": [
        +     ]
        +}
        +
        +
        +

        And the output will be:

        +
        {
        +     "class": "row",
        +     "collapse": false,
        +     "editable": true,
        +     "height": "150px",
        +     "panels": [
        +
        +     ]
        +}
        +
        +
        +

        We can see that the template added the panels attribute and that it overrides the height attribute.

        +
        +
        +

        Panel Example

        +

        Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

        +
        {
        +     "class": "row",
        +     "panels": [
        +         {
        +             "class": "bytes_panel",
        +             "span": 3,
        +             "targets": [
        +                 {
        +                     "expr": "sum(node_filesystem_avail) by (instance)",
        +                     "intervalFactor": 1,
        +                     "legendFormat": "",
        +                     "metric": "",
        +                     "refId": "A",
        +                     "step": 1
        +                 }
        +             ],
        +             "title": "Available Disk Size"
        +         }
        +     ]
        +}
        +
        +
        +

        In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

        +

        You can also see that the span attribute is overridden to set the panel size.

        +

        To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

        +
        +
        +

        Grafana Formats and Layouts

        +

        The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

        +

        Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

        +

        The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

        +

        To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

        +

        The panel’s height will be taken from their row. The span attribute is still supported as is row height.

        +

        You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

        +

        gridPos has the following attributes:

        +
        {
        +   "x": 0,
        +   "y": 0,
        +   "w": 24,
        +   "h": 4
        + }
        +
        +
        +

        When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

        +
        {
        +   "gridPos": {
        +      "h": 2
        +    }
        +}
        +
        +
        +
        +
        +

        Generating the dashboards from templates (generate-dashboards.sh)

        +
        +

        Prerequisite

        +

        Python 2.7

        +

        make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

        +

        Use the -h flag to get help information.

        +

        You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

        +

        When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

        +

        For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

        +

        .\generate-dashboards.sh -v 2020.1

        +
        +

        Note

        +

        generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

        +
        +
        +
        +
        +

        Validation

        +

        After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

        +

        Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/reference/index.html b/branch-3.10/reference/index.html new file mode 100644 index 000000000..744fb2f18 --- /dev/null +++ b/branch-3.10/reference/index.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Reference Guide

        +
        +
        +

        There are several reference guides available which give additional information. Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/reference/matrix.html b/branch-3.10/reference/matrix.html new file mode 100644 index 000000000..ed0d6b5ca --- /dev/null +++ b/branch-3.10/reference/matrix.html @@ -0,0 +1,791 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Support Matrix

        +

        The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

        + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        Scylla Monitoring Stack Version

        Scylla Open Source Version

        Scylla Enterprise Version

        Node_exporter[1] Version

        Scylla Manager Version

        3.10

        4.3, 4.4, 4.5, 4.6

        2020.1, 2021.1

        0.17

        2.3, 2.4, 2.5, 2.6

        3.9

        4.3, 4.4, 4.5, 4.6

        2020.1, 2021.1

        0.17

        2.3, 2.4, 2.5

        3.8

        4.3, 4.4, 4.5

        2020.1, 2021.1

        0.17

        2.3, 2.4, 2.5

        3.7

        4.2, 4.3, 4.4

        2019.1, 2020.1, 2021.1

        0.17

        2.2, 2.3

        3.6.3

        4.2, 4.3, 4.4

        2019.1, 2020.1, 2021.1

        0.17

        2.2, 2.3, 2.1

        3.6

        4.1, 4.2, 4.3

        2019.1, 2020.1

        0.17

        2.1, 2.2, 2.3

        3.6.1

        4.1, 4.2, 4.3

        2019.1, 2020.1

        0.17

        2.1, 2.2

        3.6.1

        4.1, 4.2, 4.3, 4.4

        2019.1, 2020.1

        0.17

        2.1, 2.2

        3.5

        3.3, 4.0, 4.1, 4.2

        2019.1, 2020.1

        0.17

        2.0, 2.1, 2.2

        3.4.3

        3.3, 4.0, 4.1, 4.2

        2019.1, 2020.1

        0.17

        2.0, 2.1

        3.4

        3.3, 4.0, 4.1

        2018.1, 2019.1

        0.17

        2.0, 2.1

        3.3

        3.1, 3.2, 3.3, 4.0

        2018.1, 2019.1

        0.17

        1.4, 2.0, 2.1

        3.2

        3.1, 3.2, 3.3

        2018.1, 2019.1

        0.17

        1.4, 2.0

        3.1

        2.3, 3.0, 3.1, 3.2

        2018.1, 2019.1

        0.17

        1.3, 1.4, 2.0

        3.0

        2.3, 3.0, 3.1, 3.2

        2018.1, 2019.1

        0.17

        1.3, 1.4

        2.4

        2.3, 3.0, 3.1

        2018.1, 2019.1

        0.14, 0.17

        1.3, 1.4

        2.3

        2.3, 3.0

        2018.1, 2019.1

        0.14, 0.17

        1.3

        2.2

        2.3, 3.0

        2018.1, 2019.1

        0.14, 0.17

        1.3

        2.1

        2.3, 3.0

        2018.1

        0.14, 0.17

        1.3

        +

        [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/reference/monitoring_apis.html b/branch-3.10/reference/monitoring_apis.html new file mode 100644 index 000000000..aad40121b --- /dev/null +++ b/branch-3.10/reference/monitoring_apis.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Interfaces

        +

        Scylla exposes two interfaces for online monitoring, as described below

        +
        +

        Prometheus

        +

        By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

        +

        For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

        +

        You can change the Prometheus listening address and port in scylla.yaml file

        +
        # prometheus port
        +# By default, Scylla opens prometheus API port on port 9180
        +# setting the port to 0 will disable the prometheus API.
        +prometheus_port: 9180
        +#
        +# prometheus address
        +# By default, Scylla binds all interfaces to the prometheus API
        +# It is possible to restrict the listening address to a specific one
        +prometheus_address: 0.0.0.0
        +
        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/robots.txt b/branch-3.10/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.10/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.10/search.html b/branch-3.10/search.html new file mode 100644 index 000000000..fb6e81ed0 --- /dev/null +++ b/branch-3.10/search.html @@ -0,0 +1,634 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + + + +
        + + + + + +
        + + +
        + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/searchindex.js b/branch-3.10/searchindex.js new file mode 100644 index 000000000..5abddfbd0 --- /dev/null +++ b/branch-3.10/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], "10": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], "scylla": [0, 2, 4, 7, 10, 13, 24, 25, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39], "monitor": [0, 2, 4, 7, 10, 13, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39], "stack": [0, 2, 4, 7, 10, 13, 21, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 18, 20, 22, 24, 25, 26, 27, 30, 31, 32, 33, 35, 37, 38, 39], "full": [0, 1, 3, 6, 9, 10, 24], "alert": [0, 1, 3, 5, 6, 9, 12], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 15, 18, 20, 22, 33, 35, 37], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 13, 20, 27, 37, 39], "open": [0, 1, 3, 5, 6, 9, 15, 16, 19], "sourc": [0, 1, 3, 5, 6, 9, 10, 15, 19, 20, 37], "tool": [0, 1, 3, 9, 18, 39], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 13, 15, 18, 21, 22, 23, 39], "grafana": [0, 1, 3, 8, 9, 10, 21, 23], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 12, 15, 18, 21, 22, 23, 32, 39, 40], "consist": [1, 9, 10, 20, 32], "three": [1, 6, 10], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 18, 20], "collect": [1, 5, 6, 7, 8, 9, 22, 33, 35], "store": [1, 5, 8, 9, 13, 21, 23, 25, 26, 37], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 13, 15, 20, 21, 22, 23, 39], "alertmanag": [1, 2, 7, 9, 21, 23], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 16, 20, 24, 39], "choos": [1, 3, 9, 11, 12, 14, 17, 18, 40], "topic": [1, 3, 9, 11, 12, 14, 17, 40], "get": [1, 6, 8, 9, 10, 13, 25, 32, 36, 37, 38, 39], "start": [1, 3, 5, 8, 9, 10, 13, 20, 21, 22, 23, 31], "user": [1, 2, 6, 7, 9, 24, 39], "guid": [1, 6, 9, 12, 18, 19], "download": [1, 5, 6, 9, 20, 21, 22, 23], "instal": [1, 2, 9, 18], "procedur": [1, 5, 6, 9, 18, 19], "troubleshoot": [1, 9, 30], "refer": [1, 6, 9, 12], "upgrad": [1, 12], "lesson": [1, 9, 26, 27], "univers": [1, 9], "github": [1, 5, 6, 21, 23], "project": 1, "For": [1, 2, 4, 5, 6, 7, 9, 10, 13, 16, 18, 20, 32, 33, 36, 39], "older": [1, 9, 22, 23], "version": [1, 2, 5, 7, 9, 13, 15, 18], "document": [1, 5, 6, 8, 9, 10, 13, 18, 20, 21, 22, 23], "see": [1, 2, 4, 5, 6, 9, 10, 13, 16, 18, 20, 21, 22, 23, 39], "here": [1, 5, 6, 7, 9, 10, 20], "base": [2, 5, 6, 7, 8, 9, 10, 13, 24, 39], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 20, 21, 22, 23, 27, 29, 31, 32, 38, 39, 40], "can": [2, 5, 6, 7, 8, 10, 13, 16, 18, 20, 21, 22, 23, 24, 27, 31, 32, 39, 40], "all": [2, 3, 5, 6, 8, 10, 13, 16, 18, 20, 22, 24, 28, 32, 39], "sh": [2, 3, 6, 18, 20, 21, 22, 23], "kill": [2, 6, 18, 20, 22], "script": [2, 3, 6, 7, 13, 22], "an": [2, 4, 5, 7, 8, 9, 13, 18, 20, 22, 29, 30, 32, 33, 35, 37, 39], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 13, 16, 20], "requir": [2, 8, 25, 28, 33, 39], "more": [2, 4, 5, 6, 10, 13, 16, 18, 24, 27, 30, 33, 36, 39], "manual": [2, 18], "step": [2, 5, 8, 13, 18, 20, 21, 22, 23], "onc": [2, 20, 29, 37, 39], "configur": [2, 7, 10, 13, 16, 18, 20, 32], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 20, 21, 22, 23, 31, 32, 33, 34, 37, 38, 39, 40], "two": [2, 6, 7, 8, 13, 16, 20, 23, 31, 32, 37, 39], "wai": [2, 5, 7, 10, 18, 30, 39], "launch": 2, "should": [2, 4, 5, 6, 8, 13, 18, 20, 22, 23, 24, 25, 28, 29, 30, 36, 39], "one": [2, 6, 7, 16, 20, 21, 22, 23, 25, 27, 28, 31, 32, 33, 39], "both": [2, 5, 6, 18, 21, 23, 39], "In": [2, 6, 10, 13, 18, 20, 31, 39], "particular": 2, "creat": [2, 5, 6, 7, 10, 13, 18, 24, 37, 39], "updat": [2, 5, 13, 18, 20], "yml": [2, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 31, 39], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 13, 18, 20, 21, 23, 26, 31, 32, 33, 38, 39], "make": [2, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 32, 39], "sure": [2, 5, 6, 8, 10, 13, 18, 20, 21, 22, 23, 39], "have": [2, 4, 5, 6, 7, 8, 10, 13, 18, 23, 31], "among": [2, 32], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 16, 18, 20, 21, 23], "address": [2, 5, 6, 7, 8, 16, 18, 20], "either": [2, 6], "locat": [2, 7, 10, 20, 22, 32], "scylla_serv": [2, 5, 6, 18, 20, 21, 22, 23, 39], "consul": [2, 7], "manag": [2, 5, 12, 15, 17], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 39], "exampl": [2, 4, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 32, 33, 39], "product": [2, 7], "system": [2, 7, 9, 10, 11, 21, 23, 25, 31, 32, 39], "advis": [2, 32], "extern": [2, 5, 7, 8, 10, 13, 18, 21, 23, 39], "directori": [2, 5, 7, 8, 10, 13, 20, 21, 22, 23], "databas": [2, 5, 7, 20, 27, 39], "accordingli": 2, "below": [2, 5, 6, 10, 13, 16], "read": [2, 5, 6, 8, 9, 10, 18, 20, 24, 28], "its": [2, 5, 6, 7, 8, 9, 13, 20], "from": [2, 5, 7, 8, 9, 10, 18, 20, 21, 22, 23, 24, 30, 34, 39], "note": [2, 5, 6, 7, 18, 20, 21, 23], "latter": 2, "tell": 2, "where": [2, 5, 6, 13, 18, 20, 39], "themselv": [2, 13], "which": [2, 8, 12, 13, 14, 15, 30, 33, 35, 37, 39], "differ": [2, 5, 6, 7, 8, 13, 20, 21, 22, 23, 29, 30, 39], "run": [2, 3, 5, 6, 7, 8, 9, 13, 15, 18, 20, 22, 31, 38], "follow": [2, 4, 5, 6, 7, 13, 15, 18, 20, 21, 23, 39], "command": [2, 6, 8, 18, 20, 21, 23], "datasourc": [2, 5, 6, 8, 13], "under": [2, 5, 6], "yaml": [2, 5, 6, 16], "To": [2, 4, 5, 6, 13, 16, 20, 21, 22, 23], "sashboard": 2, "t": [2, 13], "line": [2, 5, 6, 7, 8, 13, 20], "flag": [2, 6, 7, 8, 13, 18, 20, 21, 23], "v": [2, 6, 7, 8, 13, 18], "specifi": [2, 6, 7, 10, 13, 18, 20], "enterpris": [2, 6, 13, 15], "2020": [2, 6, 13, 15], "thi": [2, 4, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 24, 25, 28, 31, 32, 34, 38, 39], "your": [2, 5, 6, 7, 8, 10, 11, 13, 16, 18, 20, 21, 23, 25, 26, 27, 39], "pass": [2, 6, 7, 20], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 9, 18], "container_nam": 2, "aalert": 2, "imag": [2, 9, 18], "prom": [2, 8, 18], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 10, 13, 15, 16, 20, 21, 22, 23], "port": [2, 5, 6, 7, 16, 18, 20, 21, 23], "9093": [2, 5], "volum": [2, 4, 5, 6, 21, 23], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 13], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 13, 22], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 21, 23, 27, 28, 30, 33, 35, 36], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 13], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 13, 15], "5": [2, 5, 6, 13, 15, 18], "3000": [2, 5, 6, 21, 23], "1000": 2, "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 13, 26, 33, 35, 39], "path": [2, 5, 6, 7, 8, 10, 20, 21, 22, 23], "dir": [2, 7, 8, 21, 23], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 7, 10, 13, 15, 19, 23, 33], "3100": [2, 5], "rule": [2, 5, 7, 10, 29, 38], "conf": [2, 5, 6], "promotheu": 2, "aprom": [2, 18], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 18], "d": [2, 5, 6, 7, 8, 20, 21, 22, 23], "scylla_manager_serv": [2, 5, 6, 18, 20, 22, 23], "node_exporter_serv": [2, 5, 6, 20, 21], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 18, 20, 39], "down": [2, 10, 18, 20, 21, 23, 25, 33], "begin": [3, 11, 12, 14, 17, 40], "deploi": [3, 6], "without": [3, 6, 7, 13, 20], "us": [3, 4, 7, 9, 10, 11, 18, 20, 21, 22, 23, 27, 32, 33, 35, 37, 39], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 38], "least": [4, 5, 6], "physic": [4, 5, 6], "core": [4, 5, 6], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 21, 23, 33, 37], "storag": [4, 5, 6, 7, 9, 13], "retent": [4, 5, 6, 20], "period": [4, 5, 6, 8, 10, 20, 31, 37], "section": [4, 5, 6, 18, 20, 23, 39], "network": [4, 5, 6, 7, 18], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 18], "perform": [4, 5, 6, 31, 32, 36, 39], "block": [4, 5, 6], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 27, 33, 35, 39], "default": [4, 5, 6, 7, 10, 13, 16, 18, 20, 22, 28, 39], "15": [4, 5, 6, 20], "dai": [4, 5, 6, 7, 20], "around": [4, 5, 6, 18], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 39], "assum": [4, 5, 6, 7, 8, 10, 21, 23], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 36], "6": [4, 5, 6, 13, 15], "node": [4, 5, 7, 15, 18, 20, 25, 26, 27, 32, 33, 35, 36, 39], "cluster": [4, 5, 6, 30, 39], "each": [4, 5, 7, 8, 9, 10, 13, 15, 18, 25, 27, 32, 37, 39], "16": [4, 5, 6, 18], "so": [4, 5, 6, 7, 8, 10, 13, 18, 20, 27, 39], "total": [4, 5, 6, 8, 13], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 20, 22, 29, 37, 39], "need": [4, 5, 6, 7, 8, 13, 18, 25, 26, 27, 38, 39], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 13, 18, 34, 38, 39], "replac": [4, 5, 6, 8, 13, 21, 23], "ad": [4, 5, 6, 7, 12], "we": [4, 5, 6, 8, 9, 13, 21, 23, 39], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 13, 18, 20, 25, 31, 39], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 13, 18, 37, 39], "fast": [4, 5, 6, 38], "enough": [4, 5, 6, 38], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 13, 18, 20, 25, 32, 39], "out": [4, 5, 6, 8, 38], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 32, 33, 35], "over": [4, 5, 6], "longer": [4, 5, 6, 13, 20, 22], "durat": [4, 5, 6, 10], "e": [4, 5, 6, 13], "g": [4, 5, 6, 7, 20, 21, 23], "look": [4, 5, 6, 8, 10, 13, 39], "week": [4, 5, 6, 7], "view": [4, 5], "would": [4, 5, 6, 8, 10, 13, 20, 24, 27, 31, 39], "take": [4, 5, 6, 7, 13, 18, 20], "than": [4, 5, 6, 10, 13, 20, 39], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 32], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 18, 22, 33], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 13, 16, 20, 39], "swap": [4, 5, 6], "crash": [4, 5, 6], "instruct": [5, 6, 21, 23], "help": [5, 7, 10, 13, 39], "pleas": [5, 18], "most": [5, 10, 13, 32, 34, 39], "current": [5, 6, 7, 10, 13, 18, 21, 23], "common": [5, 7, 39], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 18], "standalon": 5, "thei": [5, 7, 10, 13, 36, 37], "alreadi": [5, 21, 23], "consolid": 5, "componen": 5, "suggest": [5, 13], "those": [5, 31], "offici": 5, "also": [5, 6, 7, 8, 10, 13], "main": [5, 20, 37], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 25, 39], "data": [5, 7, 9, 10, 13, 20, 21, 22, 23, 24, 25, 26, 27, 32, 33, 35, 36, 38, 39], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 18], "befor": [5, 6, 10, 20, 21, 22, 23, 25, 26, 33, 39], "support": [5, 6, 13, 14, 24, 30, 39], "want": [5, 6, 10, 21, 23], "latest": [5, 6, 7, 21, 23], "releas": [5, 20, 21, 22, 23], "tightli": 5, "compat": [5, 13, 18, 20, 22], "matrix": [5, 14], "cento": [5, 18], "instanc": [5, 6, 10, 13], "wget": [5, 6, 21, 23], "http": [5, 6, 8, 18, 20, 21, 23, 27, 28, 30, 36], "com": [5, 6, 21, 23, 27, 28, 30, 36], "archiv": [5, 6, 21, 23], "ref": 5, "tag": 5, "tar": [5, 6, 21, 23], "gz": [5, 6], "xvf": [5, 6], "test": [5, 18, 21, 39], "22": [5, 13], "linux": 5, "amd64": 5, "copi": [5, 20, 21, 22, 23], "file": [5, 7, 8, 10, 13, 16, 20, 22], "cp": [5, 21, 22, 23], "p": [5, 7, 8, 18, 20, 21, 23], "home": 5, "cd": [5, 6, 21, 23], "verifi": [5, 22], "point": [5, 6, 13, 21, 23], "browser": [5, 6, 8, 13, 18, 21, 23], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 18], "aggreg": 5, "inspir": 5, "central": [5, 9], "check": [5, 10, 18, 21, 23, 34, 35, 39], "recomand": 5, "local": [5, 6, 7, 8, 9, 13, 18, 21, 23, 39], "describ": [5, 6, 8, 16, 18, 39], "respons": [5, 10], "pars": [5, 9, 13, 29, 39], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 33, 35], "load": [5, 6, 18, 24, 27, 28, 39], "multipl": [5, 6, 7, 8, 9, 10, 13, 25, 28, 29, 36, 38, 39], "do": [5, 6, 7, 13, 18, 20, 21, 22, 23, 27, 39], "rsyslog": [5, 9], "second": [5, 6, 10, 18, 20, 21, 23], "relat": [5, 39], "modifi": [5, 12], "mkdir": 5, "templat": [5, 6, 8, 18, 20, 39], "edit": [5, 6, 7, 8, 13, 18], "localhost": [5, 7], "loki_ip": 5, "": [5, 6, 7, 9, 10, 13, 24, 25, 34, 37, 39], "27": [5, 6, 13], "If": [5, 6, 7, 8, 13, 18, 20, 22, 34, 36, 37, 38, 39], "besid": [5, 7, 20, 39], "expect": [5, 10, 21, 23], "scrap": 5, "job": [5, 6, 18], "onli": [5, 6, 7, 20, 22, 27, 29, 37, 39], "import": [5, 6, 7, 20, 21, 23, 31], "record": 5, "asspect": 5, "work": [5, 6, 7, 8, 10, 13, 20, 21, 23], "code": [5, 32], "shell": 5, "prom_rul": 5, "correct": [5, 22], "static": [5, 31], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 20, 30], "host": [5, 6, 7, 9, 18], "static_config": [5, 6], "target": [5, 7, 13, 16, 18, 20, 22], "127": [5, 7, 18], "right": [5, 6, 13, 32, 39], "typic": [5, 13, 25, 27, 37, 39], "node_export": [5, 6, 7, 9, 15, 18], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 13, 16, 20, 22, 28, 39], "everi": [5, 6, 7], "scrape_timeout": 5, "4": [5, 6, 13, 15], "timeout": [5, 38], "try": [5, 18], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10], "ani": [5, 6, 10, 13, 18, 32, 39], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 20], "scrape_config": [5, 20], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 16, 18], "There": [5, 6, 8, 10, 12, 13, 14, 36, 38, 40], "instead": [5, 6, 8, 39], "found": [5, 6, 7, 10, 13], "must": [5, 6, 33], "even": [5, 6, 7], "center": [5, 6, 8, 39], "cat": 5, "list": [5, 6], "end": [5, 6, 20, 39], "66": [5, 18], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8], "dc1": [5, 6], "172": [5, 6, 18], "17": [5, 6, 15, 18, 22], "dc2": [5, 6], "previou": [5, 23], "deprec": 5, "5090": [5, 6, 18], "tsdb": [5, 7, 8], "accumul": 5, "consol": [5, 18], "visibl": 5, "execut": [5, 24, 29], "through": 5, "node_memory_memfre": 5, "And": [5, 13, 21, 23], "scylla_reactor_util": 5, "At": [5, 13, 23], "emit": 5, "abl": [5, 8, 20, 22], "them": [5, 7, 9, 10, 13, 22, 32], "grafna": 5, "depend": [5, 8], "repositori": [5, 6], "yum": 5, "zip": [5, 21, 23], "structur": 5, "rest": [5, 8], "access": [5, 7], "sudo": [5, 6, 18], "r": [5, 7, 13, 18], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 13, 18], "provis": [5, 6, 13], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 13, 25, 26, 33, 37, 39], "folder": 5, "name": [5, 6, 8, 10, 18, 22, 39], "otherwis": 5, "some": [5, 8, 10, 32, 36], "tabl": [5, 6, 10, 15, 24, 32, 39], "apivers": 5, "type": [5, 13, 39], "url": [5, 8, 20], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 32, 40], "connect": [5, 8, 13, 16, 18], "between": [5, 8, 18, 20, 21, 23, 32, 39], "give": [5, 12, 14], "strongli": 5, "encourag": 5, "restrict": [5, 16], "keyspac": [5, 6], "part": [5, 6, 10, 22, 24, 27, 32, 39], "option": [5, 6, 8, 9, 18, 20, 31], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 13, 20], "detail": [5, 10, 32], "done": [5, 6, 7, 13, 18], "first": [5, 21, 23, 39], "new": [5, 6, 18, 37], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 39], "AND": 5, "login": [5, 6, 18], "proper": [5, 18], "select": [5, 32, 39], "permiss": [5, 6, 20], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 13, 29], "mention": [5, 13], "previous": [5, 23], "safer": [5, 39], "dedic": [5, 6], "limit": [5, 6, 8, 10, 28, 31, 39], "privileg": [5, 7], "un": 5, "comment": 5, "relev": [5, 7, 32], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 18], "evalu": 6, "laptop": 6, "32": 6, "8": [6, 15, 20], "9": [6, 15], "29": 6, "25": [6, 18], "avoid": [6, 13, 18, 28, 30, 39], "root": [6, 18, 21, 23], "go": [6, 18], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 21, 23], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 18, 20], "extract": 6, "binari": [6, 18], "clone": 6, "git": 6, "directli": [6, 9], "checkout": 6, "restart": [6, 7, 8, 20], "know": [6, 18, 27, 39], "higher": [6, 27, 39], "wish": [6, 7], "match": [6, 39], "datacent": 6, "nodetool": 6, "statu": [6, 18], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 20], "listen": [6, 7, 16, 20], "set": [6, 7, 10, 13, 16], "inform": [6, 7, 12, 13, 14, 16, 24, 25, 26], "agent": [6, 7, 8, 9, 15, 18], "machin": [6, 7, 18, 22], "overrid": [6, 7, 13], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 13], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 18, 21, 23], "within": [6, 10, 13], "protect": 6, "assign": 6, "place": [6, 7, 8, 13, 39], "outsid": [6, 7, 20], "result": [6, 7, 20, 25, 27, 28, 37, 39], "lost": [6, 7, 13, 39], "exist": [6, 13, 39], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 31, 39], "firewal": [6, 18], "7000": [6, 18], "myservic": 6, "m": [6, 7, 20, 21, 23], "2019": [6, 15, 36], "reach": [6, 8, 27, 33, 39], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 27, 28, 33, 35, 39], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 13, 18], "authent": [6, 7], "disabl": [6, 16], "simplest": 7, "small": [7, 37], "util": [7, 13, 22], "appropri": 7, "h": [7, 13], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 33, 38], "map": 7, "bind": [7, 16], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 20, 26, 29, 32], "addit": [7, 8, 9, 10, 12, 14, 39], "auto": 7, "automat": 7, "failur": [7, 18, 38], "gui": [7, 13, 18], "keep": [7, 20], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "specif": [7, 10, 16, 18, 34, 39], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 13], "mean": [7, 13, 20, 24, 25, 26, 27, 28, 33, 35, 39], "chang": [7, 13, 16, 18, 20, 21, 22, 23, 31], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 13], "b": 7, "o": [7, 15, 22, 32], "disk": [7, 10, 13, 18, 24, 26, 32], "possibl": [7, 10, 16, 30, 39], "api": [7, 8, 16, 20], "resolv": 7, "explicitli": [7, 13], "request": [7, 16, 32, 38], "how": [7, 8, 10, 13, 21, 23, 25, 26, 27, 32, 39], "someth": [7, 10, 11, 13, 37], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 13], "horizont": 8, "scale": [8, 38], "backup": 8, "benefit": [8, 39], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 21, 23], "reason": [8, 13, 18, 35, 39], "why": 8, "million": 8, "singl": [8, 13, 32], "capac": 8, "sometim": 8, "traffic": [8, 18, 36, 39], "reachabl": [8, 20], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 13, 20, 21, 23, 26], "expos": [8, 16, 20], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 32], "10903": 8, "10904": 8, "replica": [8, 25, 26, 27, 32, 33, 39], "abov": [8, 21, 23], "last": 8, "db_address": 8, "could": [8, 32, 36, 38, 39], "long": [8, 10, 37], "now": [8, 10], "grafan": 9, "render": [9, 13], "sidecar": 9, "receiv": [9, 10, 39], "distribut": [9, 27, 36, 39], "email": [9, 10], "slack": [9, 10], "displai": [9, 22], "enhanc": [10, 11], "notifi": [10, 11, 32], "wrong": [10, 11, 13, 18, 37, 39], "shown": [10, 18, 21, 23], "overview": [10, 32], "condit": 10, "met": 10, "certain": 10, "defin": [10, 13, 20, 30, 39], "what": 10, "happen": [10, 18], "report": [10, 15, 18, 39], "let": [10, 20], "u": 10, "instancedown": 10, "expr": [10, 13], "60": 10, "sever": [10, 12, 14, 40], "annot": 10, "descript": [10, 32], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 13, 21], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 39], "rout": [10, 27, 39], "repres": 10, "tree": 10, "win": [10, 18], "inhibit": 10, "mute": 10, "via": [10, 18], "sluck": 10, "wors": 10, "correctli": [10, 13, 20, 22], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 22], "reduc": [10, 13, 25], "simul": 10, "actual": [10, 35], "low": [10, 39], "space": 10, "lower": [10, 39], "fire": 10, "show": [10, 13, 15, 39], "propag": 10, "valu": [10, 13, 29, 37, 39], "similar": [10, 13], "free": 10, "big": [10, 39], "bisect": 10, "problem": [10, 31, 32, 38, 39], "explain": [13, 21, 23, 32], "intern": [13, 27, 39], "potenti": [13, 32, 39], "issu": [13, 32, 36, 39], "whenev": 13, "save": 13, "earlier": 13, "overridden": 13, "perman": 13, "eventu": 13, "made": 13, "larg": [13, 32], "maintain": 13, "json": 13, "too": [13, 31, 37], "verbos": 13, "element": [13, 32], "object": 13, "attribut": 13, "graph": [13, 20, 22, 39], "aliascolor": 13, "bar": 13, "error": [13, 32, 33, 35], "fill": [13, 38], "grid": 13, "threshold1": 13, "null": 13, "threshold1color": 13, "rgba": 13, "216": 13, "200": 13, "threshold2": 13, "threshold2color": 13, "234": 13, "112": 13, "gridpo": 13, "w": [13, 18], "x": [13, 18, 19], "y": [13, 19], "id": [13, 18], "isnew": 13, "legend": 13, "avg": 13, "max": 13, "min": 13, "linewidth": 13, "link": [13, 32], "nullpointmod": 13, "percentag": [13, 39], "pointradiu": 13, "flot": 13, "seriesoverrid": 13, "span": 13, "steppedlin": 13, "sum": 13, "node_filesystem_avail": 13, "intervalfactor": 13, "legendformat": 13, "refid": 13, "timefrom": 13, "timeshift": 13, "titl": 13, "size": [13, 28, 39], "tooltip": 13, "msresolut": 13, "share": [13, 31], "sort": [13, 30, 39], "value_typ": 13, "cumul": 13, "transpar": 13, "xaxi": 13, "yax": 13, "percent": 13, "logbas": 13, "101": 13, "short": 13, "imagin": 13, "redund": 13, "resembl": 13, "css": 13, "hierarch": 13, "definit": [13, 20, 39], "inherit": 13, "row": [13, 30, 39], "base_row": 13, "collaps": 13, "height": 13, "250px": 13, "Will": 13, "150px": 13, "output": 13, "consid": 13, "bytes_panel": 13, "byte": 13, "unit": 13, "axi": 13, "adjust": 13, "readabl": 13, "gb": 13, "mb": 13, "grasp": 13, "origin": [13, 34], "12": [13, 18], "wa": [13, 39], "larger": 13, "break": [13, 28, 39], "later": 13, "were": [13, 20, 39], "absolut": 13, "posit": 13, "width": 13, "backward": [13, 18, 20, 22], "ve": 13, "had": 13, "imposs": 13, "hand": 13, "overcom": 13, "transit": [13, 22], "calcul": 13, "taken": [13, 20], "still": 13, "unlik": 13, "partial": 13, "24": 13, "don": 13, "python": 13, "make_dashboard": 13, "revers": [13, 32], "usual": [13, 18, 32, 39], "easier": 13, "wrapper": 13, "re": [13, 27], "just": 13, "refresh": 13, "generate_gener": 13, "ran": 13, "mayb": 13, "interfac": [14, 18], "2021": 15, "2018": [15, 28], "14": [15, 18], "onlin": 16, "prometheus_port": 16, "prometheus_address": 16, "integr": 17, "56090": 18, "old": [18, 21, 22, 23], "howev": 18, "twice": 18, "easiest": 18, "remov": [18, 20], "scylla_manager1": 18, "messag": 18, "wait": [18, 33], "non": [18, 20, 26, 27, 32, 36, 39], "post": 18, "past": [18, 22], "mai": [18, 32, 33, 39], "ownership": 18, "la": 18, "grep": 18, "drwxr": 18, "xr": 18, "4096": 18, "jun": 18, "51": 18, "chown": 18, "appear": 18, "unreach": [18, 33], "immedi": 18, "suspect": 18, "tab": 18, "rang": [18, 39], "align": 18, "On": [18, 32], "41bd3db26240": 18, "entrypoin": 18, "ago": 18, "23": 18, "7001": 18, "tcp": 18, "9042": 18, "9160": 18, "10000": 18, "click": 18, "usag": [18, 27, 39], "fetch": 18, "curl": 18, "scylla_nod": 18, "return": [18, 20, 24, 25, 26, 28, 33, 35, 39], "ef": 18, "gre": 18, "scylla_setup": 18, "9100": 18, "while": [18, 20, 21, 23, 31], "captur": 18, "tshark": 18, "f": 18, "dst": 18, "eth0": 18, "toward": 18, "199": 18, "203": 18, "229": 18, "89": 18, "142": 18, "59212": 18, "ack": 18, "seq": 18, "317": 18, "78193": 18, "158080": 18, "len": 18, "tsval": 18, "79869679": 18, "tsecr": 18, "3347447210": 18, "74": 18, "60440": 18, "syn": 18, "29200": 18, "mss": 18, "1460": 18, "sack_perm": 18, "79988291": 18, "128": 18, "sinc": 20, "parallel": [20, 21, 23], "migrat": [20, 21, 23], "lose": 20, "histor": 20, "process": [20, 31, 38], "safe": 20, "page": [20, 22, 32], "unzip": [20, 21, 22, 23], "3001": [20, 21, 23], "9091": [20, 21, 23], "9094": 20, "fail": [20, 25, 27, 32, 39], "loss": 20, "everyth": 20, "stop": [20, 21, 22, 23], "format": 20, "rule_fil": 20, "9111": 20, "phase": [20, 22], "serv": 20, "remote_read": 20, "v1": 20, "histori": [20, 22], "continu": [20, 21, 23], "back": [20, 25], "recommend": [21, 23], "uninstal": [21, 23], "minor": [21, 23], "9095": [21, 23], "brows": [21, 23], "satisfi": [21, 23], "shut": [21, 23], "caus": [21, 23, 27, 39], "blackout": [21, 23], "normal": [21, 23], "dure": [21, 23], "oper": [21, 23, 32, 39], "complet": [21, 23], "switch": 22, "fulli": 22, "affect": 22, "helper": 22, "node_exporter_instal": 22, "ship": 22, "sub": 22, "color": 22, "simpli": 22, "side": [23, 24, 32, 39], "newer": 23, "primari": [24, 39], "kei": [24, 30, 39], "scan": 24, "These": [24, 39], "kind": [24, 39], "bigger": 24, "care": [24, 25, 26, 39], "replicationfactor": [25, 26], "piec": 25, "determin": [25, 26, 33, 39], "mani": [25, 26, 39], "repli": [25, 26, 28, 33, 35, 39], "unavail": [25, 39], "client": [25, 28, 32, 39], "respond": 25, "accompani": 25, "deep": 25, "understand": 25, "fall": 25, "mechan": 25, "write": 26, "acknowledg": 26, "coordin": [26, 27, 33, 35, 39], "hint": 26, "fact": 26, "yet": 26, "ideal": [27, 39], "latenc": [27, 32, 39], "resourc": [27, 30, 39], "driver": [27, 28, 36, 39], "replic": [27, 33, 35, 39], "prepar": [27, 32, 36], "statement": [27, 29, 32, 36], "balanc": [27, 32, 39], "polici": 27, "cours": 27, "intro": 27, "recap": 27, "ring": [27, 39], "architectur": 27, "chunk": [28, 39], "increas": [28, 39], "overal": [28, 31, 39], "thu": 28, "www": [28, 36], "07": 28, "13": 28, "effici": [28, 39], "optim": [29, 36, 40], "concret": 29, "thumb": 29, "alwai": 29, "favor": 29, "partit": [30, 32], "BY": [30, 39], "ineffici": [30, 39], "consum": 30, "doc": 30, "background": [31, 38], "much": [31, 39], "impact": [31, 32], "face": 31, "compaction_static_shar": 31, "100": [31, 38], "recogn": 32, "bad": 32, "practic": [32, 36], "solv": 32, "left": 32, "categori": [32, 39], "jump": 32, "warn": 32, "cell": 32, "indic": [32, 37, 38, 39], "model": [32, 36, 38, 39], "imbal": 32, "shard": 32, "imbalanc": 32, "hot": 32, "bottleneck": [32, 36], "cach": 32, "hit": 32, "filter": 32, "token": 32, "awar": 32, "order": [32, 39], "due": 32, "unsatisfi": 32, "faulti": 32, "evict": 32, "answer": [33, 35], "aka": 33, "factor": 33, "quorum": [33, 39], "hardwar": [34, 38], "occur": 34, "leav": 35, "risk": 35, "identifi": [35, 39], "evenli": 36, "across": 36, "becom": 36, "explan": 36, "08": 36, "best": 36, "field": 37, "being": 37, "defi": 37, "purpos": 37, "might": 37, "shed": 38, "drop": [38, 39], "compact": 38, "repair": 38, "que": 38, "upper": 39, "gaug": 39, "inspect": 39, "zero": 39, "mislead": 39, "panel": 39, "holder": 39, "prevent": 39, "inject": 39, "rate": 39, "did": 39, "compound": 39, "column": 39, "ks1": 39, "table_demo": 39, "text": 39, "int": 39, "desc": 39, "cat1": 39, "asc": 39, "overhead": 39, "thing": 39, "major": 39, "success": 39, "hurt": 39, "cl": 39, "expens": 39, "term": 39, "cost": 39, "ONE": 39, "local_quorum": 39, "local_on": 39, "reli": 39, "nearest": 39, "advisor": 40}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 32, 40], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 32, 40], "stack": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 32, 40], "us": [2, 5, 6, 8, 13, 24, 25, 26, 30, 40], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 13], "set": [2, 5, 20, 21, 23], "prometheu": [2, 4, 5, 6, 7, 8, 10, 16, 20], "grafana": [2, 5, 6, 7, 13, 18], "provis": 2, "data": [2, 6, 8, 18], "sourc": [2, 8, 18], "file": [2, 6, 18, 21, 23], "dashboard": [2, 6, 13], "load": 2, "start": [2, 6, 7, 18], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 20, 21, 22, 23], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 13, 20, 38], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 34], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 31], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 18], "configur": [5, 6, 8], "enabl": 5, "compat": 6, "matrix": [6, 15], "post": [6, 28, 36], "node": [6, 34], "from": [6, 13], "manag": [6, 7, 11, 18], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 18], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": [6, 20, 21, 22, 23], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 13, 21, 23, 32, 39], "all": [7, 21, 23, 25], "sh": [7, 13], "command": 7, "gener": [7, 13], "option": 7, "relat": [7, 20, 21, 22, 23], "ldap": 7, "support": [7, 15], "retent": 7, "period": 7, "alert": [7, 10, 11, 20], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 24, 25, 26, 27, 28, 29, 30, 36, 39], "updat": 8, "high": 9, "level": [9, 18, 25, 26, 33, 39], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 13], "procedur": [12, 20, 21, 22, 23], "modifi": 13, "limit": 13, "consist": [13, 25, 26, 33, 39], "between": 13, "restart": 13, "upgrad": [13, 18, 19, 20, 21, 22, 23], "templat": 13, "class": 13, "panel": 13, "exampl": 13, "format": 13, "layout": 13, "valid": [13, 20, 21, 22, 23], "refer": 14, "guid": [14, 17, 20, 21, 22, 23], "interfac": 16, "troubleshoot": [17, 18], "problem": 18, "2": [18, 20, 21, 22], "duplic": 18, "inform": 18, "A": 18, "contain": [18, 21, 23], "fail": [18, 33, 35], "To": 18, "And": 18, "permiss": 18, "No": 18, "point": 18, "solut": 18, "chart": 18, "show": 18, "error": [18, 34], "sign": 18, "server": [18, 21, 23], "metric": 18, "notic": 18, "open": 18, "3": [18, 20, 22, 23], "0": 18, "enterpris": 18, "2019": 18, "1": [18, 20, 22], "work": 18, "wireshark": 18, "x": [20, 21, 22, 23], "latest": 20, "new": [20, 21, 22, 23], "rule": 20, "4": 20, "move": [20, 21, 23], "old": 20, "b": 20, "rollback": [20, 21, 22, 23], "link": [20, 21, 22, 23, 26, 27, 28, 30, 36], "y": [21, 23], "": [21, 23], "i": [21, 23, 34], "run": [21, 23], "correct": [21, 23], "correctli": [21, 23], "kill": [21, 23], "node_export": 22, "test": 23, "mode": 23, "some": [24, 25, 26, 27, 28, 29, 30, 33, 35], "allow": [24, 39], "filter": [24, 39], "ani": 26, "univers": [26, 27], "ar": [27, 28, 29, 36], "token": [27, 39], "awar": [27, 39], "select": 28, "non": [28, 29], "page": [28, 39], "blog": [28, 36], "prepar": [29, 37, 39], "revers": [30, 39], "order": 30, "document": 30, "compact": 31, "take": 31, "lot": 31, "cpu": 31, "advisor": 32, "section": 32, "oper": [33, 35], "due": 33, "unsatisfi": 33, "o": 34, "can": 34, "indic": 34, "faulti": 34, "replica": 35, "side": 35, "cql": [36, 39], "balanc": 36, "among": 36, "shard": 36, "statement": [37, 39], "cach": 37, "evict": 37, "overload": 38, "optim": 39, "read": 39, "cross": 39, "dc": 39, "request": 39}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Prepared statements cache eviction": [[37, "prepared-statements-cache-eviction"]], "CQL queries are not balanced among shards": [[36, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[36, "blog-post-link"]], "Compaction takes lots of memory and CPU": [[31, "compaction-takes-lots-of-memory-and-cpu"]], "Scylla Monitoring Stack Advisor": [[32, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[32, "the-advisor-section"]], "System Overload": [[38, "system-overload"]], "The CQL Optimization": [[39, "the-cql-optimization"]], "Prepared Statements": [[39, "prepared-statements"]], "Token Aware": [[39, "token-aware"]], "Paged Queries": [[39, "paged-queries"]], "Reversed CQL Reads": [[39, "reversed-cql-reads"]], "ALLOW FILTERING": [[39, "allow-filtering"]], "Consistency Level": [[39, "consistency-level"]], "Cross DC": [[39, "cross-dc"]], "Cross DC Consistency Level": [[39, "cross-dc-consistency-level"]], "Cross DC read requests": [[39, "cross-dc-read-requests"]], "I/O Errors can indicate a node with a faulty disk": [[34, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some operations failed on the replica side": [[35, "some-operations-failed-on-the-replica-side"]], "Some queries use reverse order": [[30, "some-queries-use-reverse-order"]], "Documentation link": [[30, "documentation-link"]], "Some operation failed due to unsatisfied consistency level": [[33, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Some queries use Consistency Level: ANY": [[26, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[26, "link-to-scylla-university"]], "Some queries are non-prepared": [[29, "some-queries-are-non-prepared"]], "Some queries use Consistency Level: ALL": [[25, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[20, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "Upgrade Procedure": [[20, "upgrade-procedure"], [22, "upgrade-procedure"], [21, "upgrade-procedure"], [23, "upgrade-procedure"]], "1. Upgrade to the latest 1.x version": [[20, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[20, "install-the-new-monitoring-stack"], [22, "install-the-new-monitoring-stack"]], "Validation": [[20, "validation"], [13, "validation"]], "3. Alerting Rules": [[20, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[20, "moving-to-prometheus-2-x"]], "a. Set the old system": [[20, "a-set-the-old-system"]], "b. Set the new system": [[20, "b-set-the-new-system"]], "Validate the upgrade": [[20, "validate-the-upgrade"], [22, "validate-the-upgrade"]], "Rollback": [[20, "rollback"], [22, "rollback"]], "Related Links": [[20, "related-links"], [22, "related-links"], [21, "related-links"], [23, "related-links"]], "Some SELECT queries are non-paged": [[28, "some-select-queries-are-non-paged"]], "Blog-post Links": [[28, "blog-post-links"]], "Some queries are not token-aware": [[27, "some-queries-are-not-token-aware"]], "University link": [[27, "university-link"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[22, "validate-node-exporter-version"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[21, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[21, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[21, "setting-the-server-s-files"], [23, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[21, "validate-the-new-version-is-running-the-correct-version"], [23, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[21, "validate-the-version-installed-correctly"], [23, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[21, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[21, "kill-all-containers"], [23, "kill-all-containers"]], "Rollback to version 2.x": [[21, "rollback-to-version-2-x"]], "Some queries use ALLOW FILTERING": [[24, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[23, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[23, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[23, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[23, "move-to-version-3-y-the-new-version"]], "Rollback to version 3.x": [[23, "rollback-to-version-3-x"]], "Using Scylla Monitoring Stack": [[40, "using-scylla-monitoring-stack"]], "Scylla Monitoring Stack Interfaces": [[16, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[16, "prometheus"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[17, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Procedures": [[12, "scylla-monitoring-stack-procedures"]], "Scylla Monitoring Stack Reference Guide": [[14, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Upgrade Scylla Monitoring Stack": [[19, "upgrade-scylla-monitoring-stack"]], "Adding and Modifying Dashboards": [[13, "adding-and-modifying-dashboards"]], "General Limitations": [[13, "general-limitations"]], "Consistency Between Restarts": [[13, "consistency-between-restarts"]], "Consistency Between Upgrades": [[13, "consistency-between-upgrades"]], "Using Templated Dashboards": [[13, "using-templated-dashboards"]], "The Template Class System": [[13, "the-template-class-system"]], "Panel Example": [[13, "panel-example"]], "Grafana Formats and Layouts": [[13, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[13, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[13, "prerequisite"], [2, "prerequisite"]], "Scylla Monitoring Stack Support Matrix": [[15, "scylla-monitoring-stack-support-matrix"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Troubleshoot Scylla Monitoring Stack": [[18, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[18, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[18, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[18, "a-container-fails-to-start"]], "Files And Directory Permissions": [[18, "files-and-directory-permissions"]], "No Data Points": [[18, "no-data-points"]], "Solution": [[18, "solution"], [18, "id1"], [18, "id2"], [18, "id3"]], "Grafana Chart Shows Error (!) Sign": [[18, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[18, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[18, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[18, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[18, "working-with-wireshark"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Scylla Monitoring Stack": [[9, "scylla-monitoring-stack"], [1, "scylla-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "The start-all.sh command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Minimal Production System Recommendations": [[4, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[4, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[4, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.10/sitemap.xml b/branch-3.10/sitemap.xml new file mode 100644 index 000000000..a01ff6bcb --- /dev/null +++ b/branch-3.10/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.10/troubleshooting/index.html b/branch-3.10/troubleshooting/index.html new file mode 100644 index 000000000..69fea34c7 --- /dev/null +++ b/branch-3.10/troubleshooting/index.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Troubleshooting Guide for Scylla Monitoring Stack

        +
        +
        +

        Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/troubleshooting/monitor_troubleshoot.html b/branch-3.10/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..6e36ef3ae --- /dev/null +++ b/branch-3.10/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,852 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Troubleshoot Scylla Monitoring Stack

        +

        This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

        +
        +

        Problem

        +
        +

        Scylla-Manager 2.2 with Duplicate information

        +

        Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

        +
          +
        • For Manager server: from 56090 to 5090

        • +
        • For Manager Agent: from 56090 to 5090

        • +
        +

        For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

        +

        However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

        +

        The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

        +

        Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

        +
        +
        +

        A Container Fails To Start

        +

        When running ./start-all.sh a container can fail to start. For example you can see the following error message:

        +
        Wait for Prometheus container to start........Error: Prometheus container failed to start
        +
        +
        +

        Should this happen, check the Docker logs for more information.

        +
        docker logs aprom
        +
        +
        +

        Usually the reason for the failure is described in the logs.

        +
        +
        +

        Files And Directory Permissions

        +
        +

        Note

        +

        Avoid running Docker containers as root.

        +
        +

        The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

        +

        If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

        +
        +

        Note

        +

        If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

        +
        +

        For example if your Prometheus data directory is /prom-data and you are using centos user

        +
        ls -la /|grep prom-data
        +
        +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
        +
        +sudo chown -R centos:centos /prom-data
        +
        +ls -la /|grep prom-data
        +
        +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
        +
        +
        +
        +
        +

        No Data Points

        +

        No data points on all data charts.

        +
        +

        Solution

        +

        If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

        +
          +
        1. Login to the Prometheus console:

        2. +
        3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

        4. +
        5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

        6. +
        +
        +
          +
        • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

        • +
        • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

        • +
        • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

        • +
        +
        +

        For example:

        +
        ./start-all.sh -v 3.1
        +
        +
        +

        More on start-all.sh options.

        +
        +
        +
        +

        Grafana Chart Shows Error (!) Sign

        +

        Run this procedure on the Scylla Monitoring Stack server.

        +

        If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

        +
        +

        Solution

        +

        On the Scylla Monitoring Stack server:

        +
          +
        1. Check Prometheus is running using docker ps.

        2. +
        +
          +
        • If it is not running check the prometheus.yml for errors.

        • +
        +

        For example:

        +
        CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
        +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
        +
        +
        +
          +
        • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

        • +
        +
        +
        +
        +

        Grafana Shows Server Level Metrics, but not Scylla Metrics

        +

        Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

        +
        +

        Solution

        +
          +
        • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

        • +
        +

        For example

        +
        curl 172.17.0.2:9180/metrics
        +
        +
        +
        +
        +
        +

        Grafana Shows Scylla Metrics, but not Server Level Metrics

        +

        Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

        +
        +

        Solution

        +

        1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

        +
          +
        1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

        2. +
        +
        +
        +

        Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

        +

        While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

        +

        If the node_exporter service is not starting it may need to be updated manually.

        +

        Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

        +
        +
        +
        +

        Working with Wireshark

        +

        No metrics shown in the Scylla Monitoring Stack.

        +
          +
        1. Install wireshark

        2. +
        +

        2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

        +

        For example:

        +
        tshark -i eth0 -f "dst port 9180"
        +
        +
        +

        Capture from Scylla node towards Scylla Monitoring Stack server.

        +

        In this example, Scylla is running.

        +
        Monitor ip        Scylla node ip
        +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
        +
        +
        +

        In this example, Scylla is not running

        +
        Monitor ip        Scylla node ip
        +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
        +
        +
        +
        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/index.html b/branch-3.10/upgrade/index.html new file mode 100644 index 000000000..d98fd6d7b --- /dev/null +++ b/branch-3.10/upgrade/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Scylla Monitoring Stack

        +
        +
        +
        +
        +
        +
        Upgrade Scylla Open Source
        +
        + +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-3.10/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..cb62fcb19 --- /dev/null +++ b/branch-3.10/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,779 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

        +

        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

        +

        Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

        +
        +

        Upgrade Procedure

        +
        +

        1. Upgrade to the latest 1.x version

        +

        Before starting the upgrade procedure, make sure you are running the latest 1.x version

        +
        +
        +

        2. Install the new monitoring stack

        +
          +
        1. Download the 2.x version from the release page.

        2. +
        3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

        4. +
        5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

          +
            +
          • scylla_servers.yml

          • +
          • scylla_manager_servers.yml

          • +
          • node_exporter_servers.yml

          • +
          +
        6. +
        7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

        8. +
        +
        ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
        +
        +
        +
        +

        Note

        +

        Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

        +
        +

        While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

        +
        ./kill-all.sh -g 3001 -p 9091 -m 9094
        +
        +
        +
        +

        Validation

        +

        Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

        +
        +
        +
        +

        3. Alerting Rules

        +

        Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

        +
        +
        +

        4. Moving to Prometheus 2.x

        +

        Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

        +

        Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

        +
        +

        a. Set the old system

        +

        The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

        +
          +
        • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

        • +
        • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

        • +
        +
        +

        Note

        +

        After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

        +
        +
        +
        +

        b. Set the new system

        +

        The following step will allow the new monitoring system to read historical metrics from the old system.

        +
          +
        • In the Prometheus prometheus.yml.template file add the following at the end:

        • +
        +
        remote_read:
        +  - url: "http://{ip}:9111/api/v1/read"
        +
        +
        +

        Where {ip} is the ip of the old system.

        +
          +
        • restart the new stack

        • +
        +
        +
        +
        +

        Validate the upgrade

        +

        You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

        +
        +
        +
        +

        Rollback

        +

        In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

        +
        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..40ab4c566 --- /dev/null +++ b/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,773 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

        +

        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

        +
        +

        Upgrade Procedure

        +

        We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

        +

        Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

        +
        +

        Install 2.y (The new version)

        +
        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
        +unzip scylla-monitoring-2.y.zip
        +cd scylla-monitoring-scylla-monitoring-2.y/
        +
        +
        +

        Replace “y” with the new minor release number, for example, 2.1.zip

        +
        +
        +

        Setting the server’s files

        +

        Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

        +
        cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
        +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
        +
        +
        +
        +
        +

        Validate the new version is running the correct version

        +

        Starting from Scylla-Monitoring version 2.2, you can run:

        +
        ./start-all.sh --version
        +
        +
        +

        To validate the Scylla-Monitoring version.

        +
        +
        +

        Validate the version installed correctly

        +

        To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

        +
        ./start-all.sh -p 9091 -g 3001 -m 9095
        +
        +
        +

        Browse to http://{ip}:9091 +And check the Grafana dashboard

        +

        Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

        +
        +

        Caution

        +

        Important: do not use the local dir flag when testing!

        +
        +

        When you are satisfied with the data in the dashboard, you can shut down the containers.

        +
        +

        Caution

        +

        Important: Do not kill the 2.x version that is currently running.

        +
        +

        Use the following command to kill the containers:

        +
        ./kill-all.sh -p 9091 -g 3001 -m 9095
        +
        +
        +

        You can start and stop the new 2.y version while testing.

        +
        +
        +

        Move to version 2.y (the new version)

        +

        Note: migrating will cause a few seconds of blackout in the system.

        +

        We assume that you are using external volume to store the metrics data.

        +
        +

        Kill all containers

        +

        Follow the instruction on how to kill the 2.y version when in testing mode.

        +

        To kill the 2.x version containers, run:

        +
        ./kill-all.sh
        +
        +
        +

        Start version 2.y in normal mode

        +

        From the new root of the scylla-monitoring-scylla-monitoring-2.y run

        +
        ./start-all.sh -d /path/to/data/dir
        +
        +
        +

        Point your browser to http://{ip}:3000 and see that the data is there.

        +
        +
        +
        +

        Rollback to version 2.x

        +

        To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

        +

        To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

        +
        ./kill-all.sh
        +cd /path/to/scylla-grafana-2.x/
        +./start-all.sh -d /path/to/data/dir
        +
        +
        +
        +
        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..6b2e5d409 --- /dev/null +++ b/branch-3.10/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,737 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

        +

        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

        +

        Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

        +
        +

        Upgrade Procedure

        +
        +

        1. Validate node_exporter version

        +

        Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

        +

        If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

        +
        +
        +

        2. Install the new monitoring stack

        +
          +
        1. Download the 3.x version from the release page.

        2. +
        3. Unzip it into a different directory.

        4. +
        5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

          +
            +
          • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

          • +
          • scylla_manager_servers.yml

          • +
          +
          +
          +

          Note

          +

          The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

          +
          +
          +
        6. +
        7. Stop the old monitoring stack

          +
          +
          ./kill-all.sh
          +
          +
          +
          +
        8. +
        9. Start the new monitoring stack

          +
          +
          ./start-all.sh -d /prometheus-data-path
          +
          +
          +
          +
        10. +
        +
        +
        +

        Validate the upgrade

        +

        You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

        +

        Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

        +
        +
        +
        +

        Rollback

        +

        To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

        +
        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-3.10/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..4d2cf107e --- /dev/null +++ b/branch-3.10/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,781 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

        +

        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

        +
        +

        Upgrade Procedure

        +

        We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

        +

        Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

        +
        +

        Install 3.y (The new version)

        +
        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
        +unzip scylla-monitoring-3.y.zip
        +cd scylla-monitoring-scylla-monitoring-3.y/
        +
        +
        +

        Replace “y” with the new minor release number, for example, 3.0.1.zip

        +
        +
        +

        Setting the server’s files

        +

        Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

        +
        cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
        +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
        +
        +
        +
        +
        +

        Validate the new version is running the correct version

        +

        Starting from Scylla-Monitoring version 2.2, you can run:

        +
        ./start-all.sh --version
        +
        +
        +

        To validate the Scylla-Monitoring version.

        +
        +
        +

        Validate the version installed correctly

        +

        To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

        +
        ./start-all.sh -p 9091 -g 3001 -m 9095
        +
        +
        +

        Browse to http://{ip}:9091 +And check the Grafana dashboard

        +

        Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

        +
        +

        Caution

        +

        Important: do not use the local dir flag when testing!

        +
        +

        When you are satisfied with the data in the dashboard, you can shut down the containers.

        +
        +

        Caution

        +

        Important: Do not kill the 3.x version that is currently running.

        +
        +
        +
        +

        Killing the new 3.y Monitoring stack in testing mode

        +

        Use the following command to kill the containers:

        +
        ./kill-all.sh -p 9091 -g 3001 -m 9095
        +
        +
        +

        You can start and stop the new 3.y version while testing.

        +
        +
        +

        Move to version 3.y (the new version)

        +

        Note: migrating will cause a few seconds of blackout in the system.

        +

        We assume that you are using external volume to store the metrics data.

        +
        +

        Kill all containers

        +

        At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

        +

        Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

        +

        kill the older 3.x version containers by running:

        +
        ./kill-all.sh
        +
        +
        +

        Start version 3.y in normal mode

        +

        From the new root of the scylla-monitoring-scylla-monitoring-3.y run

        +
        ./start-all.sh -d /path/to/data/dir
        +
        +
        +

        Point your browser to http://{ip}:3000 and see that the data is there.

        +
        +
        +
        +

        Rollback to version 3.x

        +

        To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

        +

        To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

        +
        ./kill-all.sh
        +cd /path/to/scylla-grafana-3.x/
        +./start-all.sh -d /path/to/data/dir
        +
        +
        +
        +
        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlAllowFiltering.html b/branch-3.10/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..1dca0e258 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries use ALLOW FILTERING

        +

        Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

        +

        These kinds of queries can create a bigger load on Scylla, and should be used with care.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlCLAll.html b/branch-3.10/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..bfc0beacf --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries use Consistency Level: ALL

        +

        Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

        +

        Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

        +

        Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlCLAny.html b/branch-3.10/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..ca1ef7260 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries use Consistency Level: ANY

        +

        Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

        +

        Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlNoTokenAware.html b/branch-3.10/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..f730b18ef --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries are not token-aware

        +

        Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

        +

        Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlNonPaged.html b/branch-3.10/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..974513e71 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some SELECT queries are non-paged

        +

        By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

        +
        +

        Blog-post Links

        +

        https://www.scylladb.com/2018/07/13/efficient-query-paging/

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlNonPrepared.html b/branch-3.10/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..23d2d7799 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries are non-prepared

        +

        Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/cqlReverseOrder.html b/branch-3.10/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..83546346b --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Some queries use reverse order

        +

        Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

        +

        Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/heavyCompaction.html b/branch-3.10/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..24ce52f6d --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Compaction takes lots of memory and CPU

        +

        Scylla runs compaction periodically as a background process. While running compaction is important, there are situations that +the compaction takes too much CPU. +In those cases the compaction would impact the overall system performance.

        +

        When facing this problem, you can statically limit the compaction shares with one of two options:

        +
          +
        1. Change scylla.yml to have compaction_static_shares: 100

        2. +
        +

        or

        +
          +
        1. Start scylla with --compaction-static-shares 100

        2. +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/index.html b/branch-3.10/use-monitoring/advisor/index.html new file mode 100644 index 000000000..8df77ddd9 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/index.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Scylla Monitoring Stack Advisor

        +
        +
        +

        The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

        +
        +

        The Advisor section

        +
        +../../_images/advisor_panel.png +
        +

        The Advisor section

        +
        +
        +

        The Advisor section is located on the Overview dashboard and consists of two parts:

        +

        On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

        +

        For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

        +

        On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

        +

        For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

        +

        Each Advisor issue is explained in detail:

        + +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/nodeCLErrors.html b/branch-3.10/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..edf16e381 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Some operation failed due to unsatisfied consistency level

        +

        ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

        +

        For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

        +

        When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/nodeIOErrors.html b/branch-3.10/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..f97f31988 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        I/O Errors can indicate a node with a faulty disk

        +

        I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/nodeLocalErrors.html b/branch-3.10/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..d22e5adc0 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Some operations failed on the replica side

        +

        ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

        +

        An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-3.10/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..b171eeff5 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        CQL queries are not balanced among shards

        +

        For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

        +

        There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

        +
        +

        Blog post link

        +

        https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/preparedCacheEviction.html b/branch-3.10/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..a28631513 --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        Prepared statements cache eviction

        +

        Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

        +
          +
        • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

        • +
        • The prepared statements cache might be too small for the number of prepared statements.

        • +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/advisor/systemOverload.html b/branch-3.10/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..aecad8d3b --- /dev/null +++ b/branch-3.10/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        System Overload

        +

        There could be multiple indications that a system is overloaded:

        +
          +
        • Timeouts

        • +
        • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

        • +
        • CPU at 100% when no background process (like compaction or repair) runs.

        • +
        • Ques are getting filled.

        • +
        +

        If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/cql_optimization.html b/branch-3.10/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..69c2d7273 --- /dev/null +++ b/branch-3.10/use-monitoring/cql_optimization.html @@ -0,0 +1,785 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + + + +
        +

        The CQL Optimization

        +

        The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

        +
        +../_images/cql_optimization_master.png +
        +

        The CQL Dashboard

        +
        +
        +

        The upper part of the dashboard holds CQL related metrics.

        +

        The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

        +
        +

        Note

        +

        Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

        +
        +

        The following sections describe each of the dashboard’s panel

        +
        +

        Prepared Statements

        +

        Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

        +

        Using prepared statements has the following benefits:

        +
          +
        • The database only needs to parse the query once

        • +
        • The driver can route the query to the right node

        • +
        • Using place-holders and values is safer and prevents CQL-Injection

        • +
        +

        The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

        +

        The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

        +
        +
        +

        Token Aware

        +

        Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

        +

        Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

        +

        The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

        +

        The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

        +
        +
        +

        Paged Queries

        +

        By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

        +

        The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

        +

        The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

        +
        +
        +

        Reversed CQL Reads

        +

        Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

        +

        Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

        +

        For example, look at the following table:

        +
        CREATE TABLE ks1.table_demo (
        +   category text,
        +   type int,
        +   PRIMARY KEY (category, type))
        +WITH CLUSTERING ORDER BY (type DESC);
        +
        +
        +

        The following query uses reverse order:

        +
        select * from ks1.table_demo where category='cat1' order by type ASC;
        +
        +
        +

        The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

        +

        The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

        +
        +
        +

        ALLOW FILTERING

        +

        Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

        +

        These kinds of queries can create a big load on the system, and should be used with care.

        +

        The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

        +

        The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

        +

        The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

        +

        The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

        +

        The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

        +
        +
        +

        Consistency Level

        +

        Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

        +

        The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

        +

        Two consistency levels hold a potential problem and should be used with care ANY and ALL.

        +

        The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

        +

        The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

        +

        The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

        +

        The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

        +
        +
        +

        Cross DC

        +

        Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

        +
        +
        +

        Cross DC Consistency Level

        +

        Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

        +
        +
        +

        Cross DC read requests

        +
        +

        Note

        +

        The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

        +
        +

        In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

        +

        The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

        +
        +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.10/use-monitoring/index.html b/branch-3.10/use-monitoring/index.html new file mode 100644 index 000000000..8c8c740e9 --- /dev/null +++ b/branch-3.10/use-monitoring/index.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +
        +

        Using Scylla Monitoring Stack

        +
        +
        +

        There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

        + +
        + + +
        + + + + + + + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.5/.buildinfo b/branch-3.5/.buildinfo new file mode 100644 index 000000000..d7ee11dcb --- /dev/null +++ b/branch-3.5/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: d7af81f1722a1743d33cea5a1fe6aced +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.5/.doctrees/_common/monitor-description.doctree b/branch-3.5/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..ce7130991 Binary files /dev/null and b/branch-3.5/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.5/.doctrees/alerting.doctree b/branch-3.5/.doctrees/alerting.doctree new file mode 100644 index 000000000..0679c0b2b Binary files /dev/null and b/branch-3.5/.doctrees/alerting.doctree differ diff --git a/branch-3.5/.doctrees/cql_optimization.doctree b/branch-3.5/.doctrees/cql_optimization.doctree new file mode 100644 index 000000000..e51190bf3 Binary files /dev/null and b/branch-3.5/.doctrees/cql_optimization.doctree differ diff --git a/branch-3.5/.doctrees/environment.pickle b/branch-3.5/.doctrees/environment.pickle new file mode 100644 index 000000000..432c3b526 Binary files /dev/null and b/branch-3.5/.doctrees/environment.pickle differ diff --git a/branch-3.5/.doctrees/index.doctree b/branch-3.5/.doctrees/index.doctree new file mode 100644 index 000000000..4bd165be5 Binary files /dev/null and b/branch-3.5/.doctrees/index.doctree differ diff --git a/branch-3.5/.doctrees/matrix.doctree b/branch-3.5/.doctrees/matrix.doctree new file mode 100644 index 000000000..9d5d3d690 Binary files /dev/null and b/branch-3.5/.doctrees/matrix.doctree differ diff --git a/branch-3.5/.doctrees/min-prod-hw.doctree b/branch-3.5/.doctrees/min-prod-hw.doctree new file mode 100644 index 000000000..9566fdb25 Binary files /dev/null and b/branch-3.5/.doctrees/min-prod-hw.doctree differ diff --git a/branch-3.5/.doctrees/monitor_troubleshoot.doctree b/branch-3.5/.doctrees/monitor_troubleshoot.doctree new file mode 100644 index 000000000..f828a2703 Binary files /dev/null and b/branch-3.5/.doctrees/monitor_troubleshoot.doctree differ diff --git a/branch-3.5/.doctrees/monitor_without_docker.doctree b/branch-3.5/.doctrees/monitor_without_docker.doctree new file mode 100644 index 000000000..6ac3e7b60 Binary files /dev/null and b/branch-3.5/.doctrees/monitor_without_docker.doctree differ diff --git a/branch-3.5/.doctrees/monitoring_apis.doctree b/branch-3.5/.doctrees/monitoring_apis.doctree new file mode 100644 index 000000000..5cca5a288 Binary files /dev/null and b/branch-3.5/.doctrees/monitoring_apis.doctree differ diff --git a/branch-3.5/.doctrees/monitoring_stack.doctree b/branch-3.5/.doctrees/monitoring_stack.doctree new file mode 100644 index 000000000..d6b1ca053 Binary files /dev/null and b/branch-3.5/.doctrees/monitoring_stack.doctree differ diff --git a/branch-3.5/.doctrees/start_all.doctree b/branch-3.5/.doctrees/start_all.doctree new file mode 100644 index 000000000..21aa43e1e Binary files /dev/null and b/branch-3.5/.doctrees/start_all.doctree differ diff --git a/branch-3.5/.doctrees/updating_dashboard.doctree b/branch-3.5/.doctrees/updating_dashboard.doctree new file mode 100644 index 000000000..86cf2b51c Binary files /dev/null and b/branch-3.5/.doctrees/updating_dashboard.doctree differ diff --git a/branch-3.5/.nojekyll b/branch-3.5/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.5/404.html b/branch-3.5/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.5/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
        +

        404

        +

        The ScyllaDB monster ate your page!

        +

        + Home +

        +
        + + + \ No newline at end of file diff --git a/branch-3.5/CNAME b/branch-3.5/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.5/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.5/_common/monitor-description.html b/branch-3.5/_common/monitor-description.html new file mode 100644 index 000000000..facb0db9f --- /dev/null +++ b/branch-3.5/_common/monitor-description.html @@ -0,0 +1,590 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + + + +
        +
        + Menu +
        +
        +
        +
        +
        + + +
        +

        Caution

        +

        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

        +
        + + + +
        + +
        + +

        Scylla Monitor is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

        + + +
        + + + + + +
        + + +
        + +
        + +
        + + + + +
        + + + + + + + \ No newline at end of file diff --git a/branch-3.5/_images/1.png b/branch-3.5/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.5/_images/1.png differ diff --git a/branch-3.5/_images/2.png b/branch-3.5/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.5/_images/2.png differ diff --git a/branch-3.5/_images/3.png b/branch-3.5/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.5/_images/3.png differ diff --git a/branch-3.5/_images/alertmanager.png b/branch-3.5/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.5/_images/alertmanager.png differ diff --git a/branch-3.5/_images/cql_optimization_master.png b/branch-3.5/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.5/_images/cql_optimization_master.png differ diff --git a/branch-3.5/_images/grafana.png b/branch-3.5/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.5/_images/grafana.png differ diff --git a/branch-3.5/_images/monitor.png b/branch-3.5/_images/monitor.png new file mode 100644 index 000000000..c91eecaab Binary files /dev/null and b/branch-3.5/_images/monitor.png differ diff --git a/branch-3.5/_images/monitoring_stack.png b/branch-3.5/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.5/_images/monitoring_stack.png differ diff --git a/branch-3.5/_sources/_common/monitor-description.rst.txt b/branch-3.5/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..4893f70e3 --- /dev/null +++ b/branch-3.5/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitor is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.5/_sources/alerting.rst.txt b/branch-3.5/_sources/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.5/_sources/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.5/_sources/cql_optimization.rst.txt b/branch-3.5/_sources/cql_optimization.rst.txt new file mode 100644 index 000000000..8158d56aa --- /dev/null +++ b/branch-3.5/_sources/cql_optimization.rst.txt @@ -0,0 +1,154 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: /getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + + diff --git a/branch-3.5/_sources/index.rst.txt b/branch-3.5/_sources/index.rst.txt new file mode 100644 index 000000000..c65b962cb --- /dev/null +++ b/branch-3.5/_sources/index.rst.txt @@ -0,0 +1,48 @@ +Scylla Monitor +================= + +.. toctree:: + :hidden: + :maxdepth: 2 + + Install Scylla Monitor Stack + The start-all.sh script + Scylla Monitor Interfaces + Deploy Scylla Monitor Without Docker + Troubleshoot Monitor + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + Upgrade Guide for Scylla Monitor + CQL Optimization Dashboard + Adding and Modifying Dashboards + Alerting + Scylla Monitor Support Matrix + + +.. include:: /_common/monitor-description.rst + +For older versions of Scylla Monitoring see `here `_. + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitor Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`Install Scylla Monitor Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Scylla Monitor Interfaces ` +* :doc:`Deploy Scylla Monitor Without Docker ` +* :doc:`Troubleshoot Scylla Monitor ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* `Upgrade Guide for Monitoring `_ +* :doc:`CQL Optimization Dashboard ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Alerting ` +* :doc:`Scylla Monitor Support Matrix ` +* `Scylla Monitor lesson `_ on Scylla University + diff --git a/branch-3.5/_sources/matrix.rst.txt b/branch-3.5/_sources/matrix.rst.txt new file mode 100644 index 000000000..1aa648778 --- /dev/null +++ b/branch-3.5/_sources/matrix.rst.txt @@ -0,0 +1,80 @@ + +Scylla Monitor Support Matrix +================================ + +The following table shows which version of Scylla Monitor supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitor Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.5.3 + - 3.3, 4.0, 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.5/_sources/min-prod-hw.rst.txt b/branch-3.5/_sources/min-prod-hw.rst.txt new file mode 100644 index 000000000..db5d9c860 --- /dev/null +++ b/branch-3.5/_sources/min-prod-hw.rst.txt @@ -0,0 +1,24 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need **minimal** disk space of + +.. code:: + + 6 * 16 * 200MB ~ 20GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. diff --git a/branch-3.5/_sources/monitor_troubleshoot.rst.txt b/branch-3.5/_sources/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..9873cbad9 --- /dev/null +++ b/branch-3.5/_sources/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Monitoring +======================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +If you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Monitoring server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the monitoring server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Monitoring and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in Scylla Monitoring. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between Scylla Monitoring and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitor server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.5/_sources/monitor_without_docker.rst.txt b/branch-3.5/_sources/monitor_without_docker.rst.txt new file mode 100644 index 000000000..7db83c906 --- /dev/null +++ b/branch-3.5/_sources/monitor_without_docker.rst.txt @@ -0,0 +1,378 @@ +Deploying Scylla Monitoring Without Docker +========================================== + +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. The current monitoring solution does not churn data. + +Install Scylla Monitor +---------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-3.5.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.20.0 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz + tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.20.0.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + + +Install Prometheus +------------------ + +Tested with Prometheus version 2.18.1 + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz + tar -xvf prometheus-2.18.1.linux-amd64.tar.gz + +2. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64 + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml + + +3. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi prometheus-2.18.1.linux-amd64/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +4. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:56090 + +5. Create a data directory for Prometheus to store the metrics data + +For example: + +.. code-block:: shell + + mkdir prometheus-2.18.1.linux-amd64/mydata + + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd prometheus-2.18.1.linux-amd64 + ./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata + +Data should start accumulate on: ./mydata + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + + +Install Grafana +--------------- + +Tested with Grafna 6.7.3 + +1. Install Grafana based on the instructions `here`_ make sure to use version 6.7.0 or higher + +.. _`here` : http://docs.grafana.org/installation/ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.5/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-6.7.3/public/app + +4. Provision the Dashboard them + +For example Scylla version 4.0 and Scylla manager version 2.0 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-6.7.3/public/build/ + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-6.7.3/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.0.yaml`` would point to: ``/home/centos/grafana-6.7.3/public/build/ver_4.0`` and the FOLDER will be ``4.0`` + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-6.7.3/data/plugins + provisioning = /home/centos/grafana-6.7.3/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-6.7.3/ + ./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.5/_sources/monitoring_apis.rst.txt b/branch-3.5/_sources/monitoring_apis.rst.txt new file mode 100644 index 000000000..b0f199038 --- /dev/null +++ b/branch-3.5/_sources/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Monitoring Interfaces +===================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.5/_sources/monitoring_stack.rst.txt b/branch-3.5/_sources/monitoring_stack.rst.txt new file mode 100644 index 000000000..d01dce563 --- /dev/null +++ b/branch-3.5/_sources/monitoring_stack.rst.txt @@ -0,0 +1,328 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Without Docker `_ . + +.. _`docker`: https://docs.docker.com/install/ + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitor to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring +------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz + tar -xvf scylla-monitoring-3.5.tar.gz + cd scylla-monitoring-scylla-monitoring-3.5 + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.5 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring +--------------------------- + +To monitor the cluster, Scylla Monitor (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: /operating-scylla/manager/1.4/add-a-cluster/#add-a-cluster> + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: /operating-scylla/manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag + +For example: + +.. code-block:: sh + + ./start-all.sh -v 3.1,master -M 2.0 -d prometheus-data + +will load the dashboards for Scylla versions ``3.1`` and ``master`` and the dashboard for Scylla Manager ``2.0`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + + + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. + + + diff --git a/branch-3.5/_sources/start_all.rst.txt b/branch-3.5/_sources/start_all.rst.txt new file mode 100644 index 000000000..f970259a6 --- /dev/null +++ b/branch-3.5/_sources/start_all.rst.txt @@ -0,0 +1,98 @@ +The start-all.sh command +======================== + +Scylla Monitor is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "-storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.5/_sources/updating_dashboard.rst.txt b/branch-3.5/_sources/updating_dashboard.rst.txt new file mode 100644 index 000000000..d79e95432 --- /dev/null +++ b/branch-3.5/_sources/updating_dashboard.rst.txt @@ -0,0 +1,298 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitor. + +It will explain about Scylla Monitor dashboard templates and how to modify them. + + +General Limitations +################### +Scylla Monitor uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitor (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitor dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each contains multiple panels. +Each row would have a total span of 12, if the total span of the panels be larger than 12, it would +break the lines into multiple lines. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +Panels height will be taken from their row. The `span` attribute is stil supported like you expect it to work, so does row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but not like Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply them all, so for example to specify that a row is 2 units height you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or help you update the template when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +this will replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2018.1 run: + +``.\generate-dashboards.sh -v 2018.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.5/_static/basic.css b/branch-3.5/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.5/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.5/_static/check-solid.svg b/branch-3.5/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.5/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.5/_static/clipboard.min.js b/branch-3.5/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.5/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.5/_static/copybutton.css b/branch-3.5/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.5/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

        Short

        + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.5/_static/copybutton.js b/branch-3.5/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.5/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.5/_static/copybutton_funcs.js b/branch-3.5/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.5/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.5/_static/css/main.css b/branch-3.5/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-3.5/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.5/_static/doctools.js b/branch-3.5/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.5/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.5/_static/documentation_options.js b/branch-3.5/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.5/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.5/_static/file.png b/branch-3.5/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.5/_static/file.png differ diff --git a/branch-3.5/_static/img/banner-background.svg b/branch-3.5/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.5/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.5/_static/img/favicon-228x228.png b/branch-3.5/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.5/_static/img/favicon-228x228.png differ diff --git a/branch-3.5/_static/img/favicon-32x32.png b/branch-3.5/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.5/_static/img/favicon-32x32.png differ diff --git a/branch-3.5/_static/img/favicon.ico b/branch-3.5/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.5/_static/img/favicon.ico differ diff --git a/branch-3.5/_static/img/icons/icon-about-team.svg b/branch-3.5/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.5/_static/img/icons/icon-about-us-m.svg b/branch-3.5/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-about-us.svg b/branch-3.5/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-alternator.svg b/branch-3.5/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-apps.svg b/branch-3.5/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-architecture.svg b/branch-3.5/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.5/_static/img/icons/icon-benchmarks.svg b/branch-3.5/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.5/_static/img/icons/icon-blog.svg b/branch-3.5/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.5/_static/img/icons/icon-careers.svg b/branch-3.5/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.5/_static/img/icons/icon-chevron-left.svg b/branch-3.5/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.5/_static/img/icons/icon-chevron-right.svg b/branch-3.5/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.5/_static/img/icons/icon-circe.svg b/branch-3.5/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-clock.svg b/branch-3.5/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-close.svg b/branch-3.5/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-cloud-docs.svg b/branch-3.5/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-cloud.svg b/branch-3.5/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-comparison.svg b/branch-3.5/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.5/_static/img/icons/icon-contact-us.svg b/branch-3.5/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.5/_static/img/icons/icon-developers-blog.svg b/branch-3.5/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.5/_static/img/icons/icon-docs.svg b/branch-3.5/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.5/_static/img/icons/icon-enterprise-m.svg b/branch-3.5/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-enterprise.svg b/branch-3.5/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-events.svg b/branch-3.5/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.5/_static/img/icons/icon-exclamation.svg b/branch-3.5/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-expand.svg b/branch-3.5/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-forum.svg b/branch-3.5/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-getting-started.svg b/branch-3.5/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-glossary.svg b/branch-3.5/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-home.svg b/branch-3.5/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-infoworld.svg b/branch-3.5/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.5/_static/img/icons/icon-integrations.svg b/branch-3.5/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-knowledge-base.svg b/branch-3.5/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-less.svg b/branch-3.5/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-live-test.svg b/branch-3.5/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.5/_static/img/icons/icon-mail-list.svg b/branch-3.5/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-manager.svg b/branch-3.5/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.5/_static/img/icons/icon-memory-management.svg b/branch-3.5/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.5/_static/img/icons/icon-modeling.svg b/branch-3.5/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-monitoring.svg b/branch-3.5/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.5/_static/img/icons/icon-networking.svg b/branch-3.5/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.5/_static/img/icons/icon-news.svg b/branch-3.5/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.5/_static/img/icons/icon-newsletter.svg b/branch-3.5/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.5/_static/img/icons/icon-nsql-guides.svg b/branch-3.5/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.5/_static/img/icons/icon-open-source.svg b/branch-3.5/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.5/_static/img/icons/icon-operator.svg b/branch-3.5/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-overview.svg b/branch-3.5/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.5/_static/img/icons/icon-partners.svg b/branch-3.5/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.5/_static/img/icons/icon-plus.svg b/branch-3.5/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-pricing.svg b/branch-3.5/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.5/_static/img/icons/icon-release-notes.svg b/branch-3.5/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.5/_static/img/icons/icon-resource-center.svg b/branch-3.5/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.5/_static/img/icons/icon-roadmap.svg b/branch-3.5/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.5/_static/img/icons/icon-search.svg b/branch-3.5/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.5/_static/img/icons/icon-slack.svg b/branch-3.5/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-stack-overflow.svg b/branch-3.5/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.5/_static/img/icons/icon-summit.svg b/branch-3.5/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/icons/icon-support.svg b/branch-3.5/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.5/_static/img/icons/icon-tech-talks.svg b/branch-3.5/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.5/_static/img/icons/icon-testing.svg b/branch-3.5/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.5/_static/img/icons/icon-thumbs-down.svg b/branch-3.5/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-thumbs-up.svg b/branch-3.5/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.5/_static/img/icons/icon-tip.svg b/branch-3.5/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.5/_static/img/icons/icon-training.svg b/branch-3.5/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.5/_static/img/icons/icon-triangle-down.svg b/branch-3.5/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.5/_static/img/icons/icon-university.svg b/branch-3.5/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.5/_static/img/icons/icon-users-blog.svg b/branch-3.5/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.5/_static/img/icons/icon-warning.svg b/branch-3.5/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.5/_static/img/icons/icon-webinars.svg b/branch-3.5/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.5/_static/img/icons/icon-whitepapers.svg b/branch-3.5/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.5/_static/img/icons/icon-workshop.svg b/branch-3.5/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.5/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.5/_static/img/logo-docs.svg b/branch-3.5/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.5/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.5/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.5/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.5/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.5/_static/img/mascots/404.jpg b/branch-3.5/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.5/_static/img/mascots/404.jpg differ diff --git a/branch-3.5/_static/img/mascots/scylla-3monsters.png b/branch-3.5/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.5/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-alternator.svg b/branch-3.5/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.5/_static/img/mascots/scylla-cloud.svg b/branch-3.5/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.5/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.5/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-computer-headset.png b/branch-3.5/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-cup-number-one.png b/branch-3.5/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-docs.svg b/branch-3.5/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.5/_static/img/mascots/scylla-drivers.svg b/branch-3.5/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.5/_static/img/mascots/scylla-enterprise.svg b/branch-3.5/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.5/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.5/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-forklift-migration.png b/branch-3.5/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-gear.png b/branch-3.5/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-hardhat.png b/branch-3.5/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-headband.png b/branch-3.5/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-headset.png b/branch-3.5/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-hearts.png b/branch-3.5/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-looking-down.png b/branch-3.5/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-looking-up.png b/branch-3.5/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.5/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.5/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-manager.svg b/branch-3.5/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.5/_static/img/mascots/scylla-monitor.svg b/branch-3.5/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.5/_static/img/mascots/scylla-movement-fast.png b/branch-3.5/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-movement.png b/branch-3.5/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-onpremise.png b/branch-3.5/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-opensource.svg b/branch-3.5/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.5/_static/img/mascots/scylla-operator.svg b/branch-3.5/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.5/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.5/_static/img/mascots/scylla-plugin.png b/branch-3.5/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-release-mascot.png b/branch-3.5/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-repair.png b/branch-3.5/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-server.png b/branch-3.5/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-sleeping.png b/branch-3.5/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-tall-measure.png b/branch-3.5/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-university.png b/branch-3.5/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-weights.png b/branch-3.5/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-window-cleaning.png b/branch-3.5/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-with-computer-2.png b/branch-3.5/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-with-computer.png b/branch-3.5/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-with-linux.png b/branch-3.5/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.5/_static/img/mascots/scylla-writting.png b/branch-3.5/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.5/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.5/_static/img/menu.svg b/branch-3.5/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.5/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.5/_static/img/scylla-monitor.png b/branch-3.5/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.5/_static/img/scylla-monitor.png differ diff --git a/branch-3.5/_static/js/main.bundle.js b/branch-3.5/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-3.5/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
      • Back
      • ',backButtonPosition:"top",wrapper:"
        ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
          "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
          ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
          ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
          ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
          ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
          "],col:[2,"","
          "],tr:[2,"","
          "],td:[3,"","
          "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Alerting

          +

          Alerts are a Prometheus enhancement to notify that something is wrong in the system.

          +

          You can read more about Prometheus alerting here

          +

          By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

          +

          In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

          +

          The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

          +_images/monitoring_stack.png +
          +

          Prometheus Alerts

          +

          The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

          +

          Each alert consists of:

          +
            +
          • Name

          • +
          • What happened

          • +
          • For how long

          • +
          • What to report

          • +
          +

          For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

          +
          - alert: InstanceDown
          +  expr: up == 0
          +  for: 60s
          +  labels:
          +    severity: "2"
          +  annotations:
          +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
          +    summary: Instance {{ $labels.instance }} down
          +
          +
          +

          The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

          +

          The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

          +

          The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

          +

          annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

          +
          +
          +

          Alertmanager

          +

          The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

          +

          The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

          +
            +
          • Routes: Represent a routing tree, the most specific rule, wins

          • +
          • Inhibition: Mute an alert, based on another alert

          • +
          • Receiver: Send a notification via email, sluck, etc’

          • +
          +

          Check the Alertmanager documentation for details on how to specify a specific receiver.

          +

          In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

          +
          +
          +

          Tips When Adding an Alert

          +

          It’s worse having an alert that does not work, than not having an alert at all

          +

          There are multiple ways you can use to make sure your alert is set correctly:

          +
            +
          • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

          • +
          • Force the alert to be active by reducing the limits or the duration.

          • +
          • When possible simulate the actual scenario and see that the alert works as expected.

          • +
          +

          For example, low available disk space.

          +

          Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

          +

          Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

          +

          Starting with a simple working expression helps you bisect problems.

          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/cql_optimization.html b/branch-3.5/cql_optimization.html new file mode 100644 index 000000000..79a3beb35 --- /dev/null +++ b/branch-3.5/cql_optimization.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          The CQL Optimization

          +

          The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

          +
          +_images/cql_optimization_master.png +
          +

          The CQL Dashboard

          +
          +
          +

          The upper part of the dashboard holds CQL related metrics.

          +

          The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

          +
          +

          Note

          +

          Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

          +
          +

          The following sections describe each of the dashboard’s panel

          +
          +

          Prepared Statements

          +

          Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

          +

          Using prepared statements has the following benefits:

          +
            +
          • The database only needs to parse the query once

          • +
          • The driver can route the query to the right node

          • +
          • Using place-holders and values is safer and prevents CQL-Injection

          • +
          +

          The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

          +

          The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

          +
          +
          +

          Token Aware

          +

          Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

          +

          Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

          +

          The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

          +

          The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

          +
          +
          +

          Paged Queries

          +

          By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

          +

          The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

          +

          The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

          +
          +
          +

          Reversed CQL Reads

          +

          Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

          +

          Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

          +

          For example, look at the following table:

          +
          CREATE TABLE ks1.table_demo (
          +   category text,
          +   type int,
          +   PRIMARY KEY (category, type))
          +WITH CLUSTERING ORDER BY (type DESC);
          +
          +
          +

          The following query uses reverse order:

          +
          select * from ks1.table_demo where category='cat1' order by type ASC;
          +
          +
          +

          The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

          +

          The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

          +
          +
          +

          ALLOW FILTERING

          +

          Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

          +

          These kinds of queries can create a big load on the system, and should be used with care.

          +

          The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

          +

          The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

          +

          The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

          +

          The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

          +

          The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

          +
          +
          +

          Consistency Level

          +

          Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

          +

          The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

          +

          Two consistency levels hold a potential problem and should be used with care ANY and ALL.

          +

          The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

          +

          The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

          +

          The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

          +

          The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

          +
          +
          +

          Cross DC

          +

          Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

          +
          +
          +

          Cross DC Consistency Level

          +

          Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

          +
          +
          +

          Cross DC read requests

          +
          +

          Note

          +

          The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

          +
          +

          In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

          +

          The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/genindex.html b/branch-3.5/genindex.html new file mode 100644 index 000000000..96bc45d44 --- /dev/null +++ b/branch-3.5/genindex.html @@ -0,0 +1,584 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + + + + + +
          + + + + + +
          + + +
          + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/index.html b/branch-3.5/index.html new file mode 100644 index 000000000..910a10ad5 --- /dev/null +++ b/branch-3.5/index.html @@ -0,0 +1,619 @@ + + + + + + + + + + + + + Scylla Monitor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Scylla Monitor

          +
          +
          +

          Scylla Monitor is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

          +

          For older versions of Scylla Monitoring see here.

          +_images/monitor.png +

          The Scylla Monitor Stack consists of three components, wrapped in Docker containers:

          +
            +
          • prometheus - collects and stores metrics

          • +
          • alertmanager - handles alerts

          • +
          • grafana - dashboard server

          • +
          +

          Choose a topic to get started:

          + +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/matrix.html b/branch-3.5/matrix.html new file mode 100644 index 000000000..73e8d5eac --- /dev/null +++ b/branch-3.5/matrix.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Scylla Monitor Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Scylla Monitor Support Matrix

          +

          The following table shows which version of Scylla Monitor supports dashboards for which versions of Scylla and Scylla Manager.

          + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

          Scylla Monitor Version

          Scylla Open Source Version

          Scylla Enterprise Version

          Node_exporter[1] Version

          Scylla Manager Version

          3.5.3

          3.3, 4.0, 4.1, 4.2, 4.3

          2019.1, 2020.1

          0.17

          2.0, 2.1, 2.2

          3.5

          3.3, 4.0, 4.1, 4.2

          2019.1, 2020.1

          0.17

          2.0, 2.1, 2.2

          3.4.3

          3.3, 4.0, 4.1, 4.2

          2019.1, 2020.1

          0.17

          2.0, 2.1

          3.4

          3.3, 4.0, 4.1

          2018.1, 2019.1

          0.17

          2.0, 2.1

          3.3

          3.1, 3.2, 3.3, 4.0

          2018.1, 2019.1

          0.17

          1.4, 2.0, 2.1

          3.2

          3.1, 3.2, 3.3

          2018.1, 2019.1

          0.17

          1.4, 2.0

          3.1

          2.3, 3.0, 3.1, 3.2

          2018.1, 2019.1

          0.17

          1.3, 1.4, 2.0

          3.0

          2.3, 3.0, 3.1, 3.2

          2018.1, 2019.1

          0.17

          1.3, 1.4

          2.4

          2.3, 3.0, 3.1

          2018.1, 2019.1

          0.14, 0.17

          1.3, 1.4

          2.3

          2.3, 3.0

          2018.1, 2019.1

          0.14, 0.17

          1.3

          2.2

          2.3, 3.0

          2018.1, 2019.1

          0.14, 0.17

          1.3

          2.1

          2.3, 3.0

          2018.1

          0.14, 0.17

          1.3

          +

          [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/min-prod-hw.html b/branch-3.5/min-prod-hw.html new file mode 100644 index 000000000..77bcc520e --- /dev/null +++ b/branch-3.5/min-prod-hw.html @@ -0,0 +1,613 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Minimal Production System Recommendations

          +
            +
          • CPU - at least 2 physical cores/ 4vCPUs

          • +
          • Memory - 15GB+ DRAM

          • +
          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

          • +
          • Network - 1GbE/10GbE preferred

          • +
          +
          +

          Calculating Prometheus Minimal Disk Space requirement

          +

          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

          +

          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

          +

          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

          +
          6 * 16 * 200MB ~ 20GB
          +
          +
          +

          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

          +
          +
          + + +
          + + + + + +
          + + +
          + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/monitor_troubleshoot.html b/branch-3.5/monitor_troubleshoot.html new file mode 100644 index 000000000..d7e08e03a --- /dev/null +++ b/branch-3.5/monitor_troubleshoot.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Troubleshoot Monitoring | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Troubleshoot Monitoring

          +

          This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

          +
          +

          Problem

          + +
          +

          Scylla-Manager 2.2 with Duplicate information

          +

          Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

          +
            +
          • For Manager server: from 56090 to 5090

          • +
          • For Manager Agent: from 56090 to 5090

          • +
          +

          For backward compatibility, Scylla Monitoring 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

          +

          If you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

          +

          The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

          +

          Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

          +
          +
          +

          A Container Fails To Start

          +

          When running ./start-all.sh a container can fail to start. For example you can see the following error message:

          +
          Wait for Prometheus container to start........Error: Prometheus container failed to start
          +
          +
          +

          Should this happen, check the Docker logs for more information.

          +
          docker logs aprom
          +
          +
          +

          Usually the reason for the failure is described in the logs.

          +
          +
          +

          Files And Directory Permissions

          +
          +

          Note

          +

          Avoid running Docker containers as root.

          +
          +

          The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

          +

          If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

          +
          +

          Note

          +

          If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

          +
          +

          For example if your Prometheus data directory is /prom-data and you are using centos user

          +
          ls -la /|grep prom-data
          +
          +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
          +
          +sudo chown -R centos:centos /prom-data
          +
          +ls -la /|grep prom-data
          +
          +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
          +
          +
          +
          +
          +

          No Data Points

          +

          No data points on all data charts.

          +
          +

          Solution

          +

          If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

          +
            +
          1. Login to the Prometheus console:

          2. +
          3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

          4. +
          5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

          6. +
          +
          +
            +
          • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

          • +
          • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

          • +
          • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

          • +
          +
          +

          For example:

          +
          ./start-all.sh -v 3.1
          +
          +
          +

          More on start-all.sh options.

          +
          +
          +
          +

          Grafana Chart Shows Error (!) Sign

          +

          Run this procedure on the Monitoring server.

          +

          If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

          +
          +

          Solution

          +

          On the monitoring server:

          +
            +
          1. Check Prometheus is running using docker ps.

          2. +
          +
            +
          • If it is not running check the prometheus.yml for errors.

          • +
          +

          For example:

          +
          CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
          +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
          +
          +
          +
            +
          • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

          • +
          +
          +
          +
          +

          Grafana Shows Server Level Metrics, but not Scylla Metrics

          +

          Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

          +
          +

          Solution

          +
            +
          • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Monitoring and Scylla server. In that case, check your IPs and firewalls.

          • +
          +

          For example

          +
          curl 172.17.0.2:9180/metrics
          +
          +
          +
          +
          +
          +

          Grafana Shows Scylla Metrics, but not Server Level Metrics

          +

          Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

          +
          +

          Solution

          +

          1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

          +
            +
          1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring and Scylla server. Please check your IPs and firewalls.

          2. +
          +
          +
          +

          Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

          +

          While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

          +

          If the node_exporter service is not starting it may need to be updated manually.

          +

          Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

          +
          +
          +
          +

          Working with Wireshark

          +

          No metrics shown in Scylla Monitoring.

          +
            +
          1. Install wireshark

          2. +
          +

          2. Capture the traffic between Scylla Monitoring and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

          +

          For example:

          +
          tshark -i eth0 -f "dst port 9180"
          +
          +
          +

          Capture from Scylla node towards Scylla Monitor server.

          +

          In this example, Scylla is running.

          +
          Monitor ip        Scylla node ip
          +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
          +
          +
          +

          In this example, Scylla is not running

          +
          Monitor ip        Scylla node ip
          +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
          +
          +
          +
          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/monitor_without_docker.html b/branch-3.5/monitor_without_docker.html new file mode 100644 index 000000000..5fe7eac19 --- /dev/null +++ b/branch-3.5/monitor_without_docker.html @@ -0,0 +1,939 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Deploying Scylla Monitoring Without Docker

          +

          The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

          +

          Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

          +
          +

          Minimal Production System Recommendations

          +
            +
          • CPU - at least 2 physical cores/ 4vCPUs

          • +
          • Memory - 15GB+ DRAM

          • +
          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

          • +
          • Network - 1GbE/10GbE preferred

          • +
          +
          +

          Calculating Prometheus Minimal Disk Space requirement

          +

          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

          +

          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

          +

          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

          +
          6 * 16 * 200MB ~ 20GB
          +
          +
          +

          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

          +

          The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. The current monitoring solution does not churn data.

          +
          +
          +
          +

          Install Scylla Monitor

          +

          The following procedure uses a CentOS 7 based instance

          +
            +
          1. Download the latest Scylla Monitoring release.

          2. +
          +

          wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz

          +
            +
          1. Open the tar

          2. +
          +

          tar -xvf scylla-monitoring-3.5.tar.gz

          +
          +
          +

          Install Alertmanager

          +

          Tested with alertmanager 0.20.0 version

          +
            +
          1. Install alertmanager

          2. +
          +
          wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz
          +tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz
          +
          +
          +
            +
          1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to alertmanager.yml in the alertmanager installation directory.

          2. +
          +

          For example:

          +
          cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml
          +
          +
          +
            +
          1. Start the Alertmanager

          2. +
          +

          For example:

          +
          cd alertmanager-0.20.0.linux-amd64
          +./alertmanager
          +
          +
          +
            +
          1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

          2. +
          +

          For example:

          +
          http://192.168.135.166:9093/
          +
          +
          +_images/alertmanager.png +
          +
          +

          Install Prometheus

          +

          Tested with Prometheus version 2.18.1

          +
            +
          1. Install Prometheus

          2. +
          +
          wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz
          +tar -xvf prometheus-2.18.1.linux-amd64.tar.gz
          +
          +
          +
            +
          1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to Prometheus installation directory.

          2. +
          +

          Copy prometheus/prometheus.yml.template to prometheus.yml

          +

          For example:

          +
          cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64
          +cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml
          +
          +
          +
            +
          1. Edit the prometheus.yml file to point to the correct static data sources.

          2. +
          +
          +

          Note

          +

          Make sure to include the honor_labels: false parameter in the prometheus.yml file.

          +
          +
          vi prometheus-2.18.1.linux-amd64/prometheus.yml
          +
          +
          +

          Set the alertmanger address and port by replacing AM_ADDRESS in the file.

          +

          For example if the alertmanager will run on the same host:

          +
          alerting:
          +   alertmanagers:
          +   - static_configs:
          +       - targets:
          +           - 127.0.0.1:9093
          +
          +
          +

          Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

          +

          For example the scrape config for Scylla:

          +
          global:
          +  scrape_interval: 5s # By default, scrape targets every 5 second.
          +  scrape_timeout: 4s # Timeout before trying to scape a target again
          +
          +  # Attach these labels to any time series or alerts when communicating with
          +  # external systems (federation, remote storage, Alertmanager).
          +  external_labels:
          +    monitor: 'scylla-monitor'
          +
          +scrape_configs:
          +- job_name: scylla
          +  honor_labels: false
          +  file_sd_configs:
          +    - files:
          +      - scylla_servers.yml
          +  relabel_configs:
          +    - source_labels: [__address__]
          +      regex:  '([^:]+)'
          +      target_label: __address__
          +      replacement: '${1}:9180'
          +
          +    - source_labels: [__address__]
          +      regex:  '(.*):.+'
          +      target_label: instance
          +      replacement: '${1}'
          +
          +
          +
            +
          1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

          2. +
          +
          +

          Note

          +

          There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

          +
          +

          An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

          +
          +

          Note

          +

          You must have both files even if you are not using Scylla Manager

          +
          +

          Add the labels for the cluster and data-center

          +

          scylla_servers.yml:

          +

          For example:

          +
          cat scylla_servers.yml
          +# List Scylla end points
          +
          +- targets:
          +  - 192.168.66.6
          +  - 192.168.66.244
          +  labels:
          +    cluster: cluster1
          +    dc: dc1
          +- targets:
          +    - 172.17.0.3
          +  labels:
          +    cluster: cluster1
          +    dc: dc2
          +
          +
          +
          +

          Note

          +

          See the previous note about deprecating the node_exporter_servers.yml file.

          +
          +

          scylla_manager_server.yml

          +

          For example:

          +
          - targets:
          +  - 127.0.0.1:56090
          +
          +
          +
            +
          1. Create a data directory for Prometheus to store the metrics data

          2. +
          +

          For example:

          +
          mkdir prometheus-2.18.1.linux-amd64/mydata
          +
          +
          +
            +
          1. Start Prometheus server:

          2. +
          +

          For example:

          +
          cd prometheus-2.18.1.linux-amd64
          +./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata
          +
          +
          +

          Data should start accumulate on: ./mydata

          +
            +
          1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

          2. +
          +

          For example:

          +
          http://192.168.135.166:9090/
          +
          +
          +_images/1.png +

          Prometheus console should be visible

          +
            +
          1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

          2. +
          +

          For example:

          +

          node_memory_MemFree

          +_images/2.png +

          And

          +

          scylla_reactor_utilization

          +_images/3.png +

          At this point Scylla is emitting the metrics and Prometheus is able to store them.

          +
          +
          +

          Install Grafana

          +

          Tested with Grafna 6.7.3

          +
            +
          1. Install Grafana based on the instructions here make sure to use version 6.7.0 or higher

          2. +
          +

          Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

          +
            +
          1. Access Scylla-Grafana-monitoring directory

          2. +
          +

          cd scylla-monitoring-scylla-monitoring-3.5/

          +
            +
          1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

          2. +
          +
          sudo cp -r grafana/plugins /var/lib/grafana/
          +
          +
          +

          If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

          +

          For example:

          +
          cp -r grafana/plugins ../grafana-6.7.3/public/app
          +
          +
          +
            +
          1. Provision the Dashboard them

          2. +
          +

          For example Scylla version 4.0 and Scylla manager version 2.0

          +

          For Grafana installed with yum install

          +
          sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
          +sudo mkdir -p /var/lib/grafana/dashboards
          +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
          +
          +
          +

          For Grafana installed from packages

          +
          cp -p -r grafana/build/* ../grafana-6.7.3/public/build/
          +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml
          +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml
          +
          +
          +

          Edit the load.* files in /home/centos/grafana-6.7.3/conf/provisioning/dashboards/ for the correct path, +for example load.4.0.yaml would point to: /home/centos/grafana-6.7.3/public/build/ver_4.0 and the FOLDER will be 4.0

          +
            +
          1. Set the data source by copy datasource.yml and edit it

          2. +
          +
          sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
          +
          +
          +

          For Grafana installed from packages

          +
          cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/
          +
          +
          +

          You should set the Prometheus and the alertmanager IP and port.

          +

          For example

          +
          sudo cat /etc/grafana/provisioning/datasources/datasource.yml
          +apiVersion: 1
          +datasources:
          + - name: prometheus
          +   type: prometheus
          +   url: http://192.168.135.167:9090
          +   access: proxy
          +   basicAuth: false
          +
          + - name: alertmanager
          +   type: camptocamp-prometheus-alertmanager-datasource
          +   orgId: 1
          +   typeLogoUrl: public/img/icn-datasource.svg
          +   access: proxy
          +   url: http://192.168.135.166:9093
          +   password:
          +   user:
          +   database:
          +   basicAuth:
          +   isDefault:
          +   jsonData:
          +     severity_critical: '4'
          +     severity_high: '3'
          +     severity_warning: '2'
          +     severity_info: '1'
          +
          +
          +
            +
          1. Start the Grafana service

          2. +
          +

          For Grafana installed with yum install

          +

          sudo service grafana-server start

          +

          For Grafana installed from packages:

          +

          cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini

          +

          Edit scylla.ini to reflect the right paths in the paths section of the file.

          +
          plugins = /home/centos/grafana-6.7.3/data/plugins
          +provisioning = /home/centos/grafana-6.7.3/conf/provisioning
          +
          +
          +

          Start the server:

          +
          cd /home/centos/grafana-6.7.3/
          +./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini
          +
          +
          +
            +
          1. Make sure Grafana is running

          2. +
          +

          Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

          +_images/grafana.png +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/monitoring_apis.html b/branch-3.5/monitoring_apis.html new file mode 100644 index 000000000..8454103d1 --- /dev/null +++ b/branch-3.5/monitoring_apis.html @@ -0,0 +1,632 @@ + + + + + + + + + + + + + Monitoring Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Monitoring Interfaces

          +

          Scylla exposes two interfaces for online monitoring, as described below

          +
          +

          Prometheus

          +

          By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

          +

          For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

          +

          You can change the Prometheus listening address and port in scylla.yaml file

          +
          # prometheus port
          +# By default, Scylla opens prometheus API port on port 9180
          +# setting the port to 0 will disable the prometheus API.
          +prometheus_port: 9180
          +#
          +# prometheus address
          +# By default, Scylla binds all interfaces to the prometheus API
          +# It is possible to restrict the listening address to a specific one
          +prometheus_address: 0.0.0.0
          +
          +
          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/monitoring_stack.html b/branch-3.5/monitoring_stack.html new file mode 100644 index 000000000..b4bc56b88 --- /dev/null +++ b/branch-3.5/monitoring_stack.html @@ -0,0 +1,919 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Install Scylla Monitoring Stack

          + +

          This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

          +

          The Scylla Monitoring stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

          +

          For evaluation, you can run Scylla Monitoring stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

          +
          +

          Minimal Production System Recommendations

          +
            +
          • CPU - at least 2 physical cores/ 4vCPUs

          • +
          • Memory - 15GB+ DRAM

          • +
          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

          • +
          • Network - 1GbE/10GbE preferred

          • +
          +
          +

          Calculating Prometheus Minimal Disk Space requirement

          +

          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

          +

          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

          +

          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

          +
          6 * 16 * 200MB ~ 20GB
          +
          +
          +

          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

          +
          +
          +
          +

          Prerequisites

          + +
          +
          +

          Docker Post Installation

          +

          Docker post installation guide can be found here

          +
          +

          Note

          +

          Avoid running the container as root.

          +
          +

          To avoid running docker as root, you should add the user you are going to use for Scylla Monitor to the Docker group.

          +
            +
          1. Create the Docker group.

          2. +
          +
          sudo groupadd docker
          +
          +
          +
            +
          1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

          2. +
          +
          sudo usermod -aG docker $USER
          +
          +
          +
            +
          1. Start Docker by calling:

          2. +
          +
          sudo systemctl enable docker
          +
          +
          +
          +
          +

          Install Scylla Monitoring

          +

          Procedure

          +
            +
          1. Download and extract the latest Scylla Monitoring Stack binary;.

          2. +
          +
          wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz
          +tar -xvf scylla-monitoring-3.5.tar.gz
          +cd scylla-monitoring-scylla-monitoring-3.5
          +
          +
          +

          As an alternative, you can clone and use the Git repository directly.

          +
          git clone https://github.com/scylladb/scylla-monitoring.git
          +cd scylla-monitoring
          +git checkout branch-3.5
          +
          +
          +
            +
          1. Start Docker service if needed

          2. +
          +
          sudo systemctl restart docker
          +
          +
          +
          +
          +

          Configure Scylla Monitoring

          +

          To monitor the cluster, Scylla Monitor (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

          +

          This configuration can be done from files, or using the Consul api.

          +

          Scylla Manager 2.0 and higher supports the Consul API.

          +
          +

          Configure Scylla nodes from files

          +
            +
          1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

          2. +
          +
          +

          Note

          +

          It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

          +
          +

          For example:

          +
          - targets:
          +      - 172.17.0.2
          +      - 172.17.0.3
          +  labels:
          +      cluster: cluster1
          +      dc: dc1
          +
          +
          +
          +

          Note

          +

          If you want to add your managed cluster to Scylla Monitoring, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

          +
          +

          Using IPV6

          +

          To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

          +

          For example:

          +
          - targets:
          +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
          +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
          +  labels:
          +      cluster: cluster1
          +      dc: dc1
          +
          +
          +
          +

          Note

          +

          For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

          +
          +

          For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

          +
          +

          Note

          +

          By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

          +
          +

          If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

          +

          For example:

          +
          ./start-all.sh -s my_scylla_server.yml -d prometheus_data
          +
          +
          +

          Mark the different Data Centers with Labels.

          +

          As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

          +

          You can use the genconfig.py script to generate the server file. For example:

          +
          ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
          +
          +
          +

          This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

          +

          OR

          +

          The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

          +
          nodetool status | ./genconfig.py -NS
          +
          +
          +

          2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

          +

          You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

          +

          For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

          +
          # List Scylla Manager end points
          +
          +- targets:
          +  - 172.17.0.7:5090
          +
          +
          +

          Note that you do not need to add labels to the Scylla Manager targets.

          +
          +
          +

          Configure Scylla nodes using Scylla-Manager Consul API

          +

          Scylla Manager 2.0 has a Consul like API.

          +

          When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

          +

          For example:

          +
          ./start-all.sh -L 10.10.0.1
          +
          +
          +
          +

          Note

          +

          If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

          +
          +
          +
          +

          Connecting Scylla-Monitoring to Scylla

          +

          Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

          +

          You can limit the user to read only, currently it only read table from the system keyspace.

          +

          To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

          +

          Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

          +
          +
          +

          Use an external directory for the Prometheus data directory

          +

          The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

          +
          +

          Note

          +

          Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

          +
          +

          If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

          +

          In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

          +
          +
          +

          Add Additional Prometheus Targets

          +

          There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

          +

          The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

          +

          You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

          +
          - job_name: 'myservice'
          +  # Override the global default and scrape targets from this job every 5 seconds.
          +  scrape_interval: 5s
          +  static_configs:
          +    - targets:
          +      - 17.0.0.1:7000
          +
          +
          +
          +
          +
          +

          Start and Stop Scylla Monitoring Stack

          +
          +

          Start

          +
          ./start-all.sh -d prometheus_data
          +
          +
          +
          +
          +

          Stop

          +
          ./kill-all.sh
          +
          +
          +
          +
          +

          Start a Specific Scylla Monitoring Stack Version

          +

          By default, start-all.sh will start with dashboards for the latest Scylla version and the latest Scylla Manager version.

          +

          You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag

          +

          For example:

          +
          ./start-all.sh -v 3.1,master -M 2.0 -d prometheus-data
          +
          +
          +

          will load the dashboards for Scylla versions 3.1 and master and the dashboard for Scylla Manager 2.0

          +
          +
          +

          Accessing the localhost

          +

          The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

          +
          ./start-all.sh -l -d prometheus-data
          +
          +
          +
          +
          +
          +

          View Grafana Dashboards

          +

          Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/objects.inv b/branch-3.5/objects.inv new file mode 100644 index 000000000..e56c12907 Binary files /dev/null and b/branch-3.5/objects.inv differ diff --git a/branch-3.5/robots.txt b/branch-3.5/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.5/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.5/search.html b/branch-3.5/search.html new file mode 100644 index 000000000..de34e93ed --- /dev/null +++ b/branch-3.5/search.html @@ -0,0 +1,587 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + + + + + +
          + + + + + +
          + + +
          + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/searchindex.js b/branch-3.5/searchindex.js new file mode 100644 index 000000000..40d3e9e4d --- /dev/null +++ b/branch-3.5/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "alerting", "cql_optimization", "index", "matrix", "min-prod-hw", "monitor_troubleshoot", "monitor_without_docker", "monitoring_apis", "monitoring_stack", "start_all", "updating_dashboard"], "filenames": ["_common/monitor-description.rst", "alerting.rst", "cql_optimization.rst", "index.rst", "matrix.rst", "min-prod-hw.rst", "monitor_troubleshoot.rst", "monitor_without_docker.rst", "monitoring_apis.rst", "monitoring_stack.rst", "start_all.rst", "updating_dashboard.rst"], "titles": ["<no title>", "Alerting", "The CQL Optimization", "Scylla Monitor", "Scylla Monitor Support Matrix", "Minimal Production System Recommendations", "Troubleshoot Monitoring", "Deploying Scylla Monitoring Without Docker", "Monitoring Interfaces", "Install Scylla Monitoring Stack", "The start-all.sh command", "Adding and Modifying Dashboards"], "terms": {"3": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11], "4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "2": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11], "0": [0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 11], "scylla": [0, 1, 2, 5, 8, 10, 11], "monitor": [0, 1, 2, 5, 10, 11], "stack": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], "full": [0, 1, 3], "alert": [0, 3, 7], "The": [0, 1, 3, 4, 5, 6, 7, 9], "contain": [0, 2, 3, 9, 10, 11], "open": [0, 3, 4, 7, 8], "sourc": [0, 1, 3, 4, 7, 9], "tool": [0, 2, 3, 6], "includ": [0, 3, 7], "prometheu": [0, 2, 3, 4, 6, 11], "grafana": [0, 1, 3], "well": [0, 3, 9], "custom": [0, 3], "dashboard": [0, 1, 2, 3, 4, 6, 7, 10], "ar": [1, 2, 6, 7, 9, 10, 11], "enhanc": 1, "notifi": 1, "someth": [1, 10, 11], "wrong": [1, 2, 6, 11], "system": [1, 2, 10], "you": [1, 2, 5, 6, 7, 8, 9, 10, 11], "can": [1, 2, 6, 7, 8, 9, 10, 11], "read": [1, 6, 9], "more": [1, 2, 6, 8, 11], "about": [1, 7, 11], "here": [1, 3, 7, 9, 10, 11], "By": [1, 2, 7, 8, 9, 10, 11], "default": [1, 2, 5, 6, 7, 8, 9, 10, 11], "shown": [1, 6], "overview": 1, "also": [1, 9, 10, 11], "configur": [1, 6, 7, 8, 10, 11], "sent": 1, "other": 1, "extern": [1, 2, 6, 7, 10, 11], "like": [1, 2, 5, 6, 7, 9, 11], "email": 1, "slack": 1, "In": [1, 2, 6, 9, 11], "gener": [1, 2, 9], "specif": [1, 2, 6, 8, 10], "condit": 1, "met": 1, "within": [1, 9], "certain": 1, "period": [1, 5, 7, 9], "time": [1, 2, 5, 7, 9, 10], "thei": [1, 10], "send": [1, 2], "them": [1, 7, 10, 11], "act": 1, "data": [1, 2, 7, 10, 11], "so": [1, 2, 6, 9, 10, 11], "activ": [1, 9], "defin": [1, 2, 11], "rule": [1, 7, 10], "yml": [1, 2, 6, 7, 9, 10], "file": [1, 7, 8, 10, 11], "locat": [1, 10], "directori": [1, 7, 10, 11], "each": [1, 2, 4, 5, 6, 7, 9, 10, 11], "consist": [1, 3], "name": [1, 2, 6, 7, 9], "what": 1, "happen": [1, 6], "For": [1, 2, 3, 5, 6, 7, 8, 9, 10, 11], "how": [1, 2, 10, 11], "long": 1, "report": [1, 2, 4, 6], "exampl": [1, 2, 5, 6, 7, 9, 10], "let": 1, "u": 1, "look": [1, 2, 9, 11], "instancedown": 1, "come": [1, 10], "part": [1, 2, 9], "expr": [1, 11], "up": [1, 2, 6, 7], "60": 1, "label": [1, 7, 9], "sever": 1, "annot": 1, "descript": 1, "instanc": [1, 7, 9, 11], "ha": [1, 2, 5, 6, 7, 9, 10, 11], "been": 1, "down": [1, 6], "than": [1, 2, 11], "30": [1, 10], "second": [1, 6, 7, 9], "summari": 1, "legal": 1, "express": 1, "thi": [1, 2, 5, 6, 7, 9, 10, 11], "case": [1, 2, 5, 6, 7, 9, 10], "metric": [1, 2, 3, 4, 5, 7, 9, 10, 11], "equal": 1, "set": [1, 7, 8, 9, 10, 11], "minim": 1, "durat": 1, "befor": [1, 2, 7, 9], "prior": 1, "pend": 1, "mode": [1, 11], "hold": [1, 2, 5, 7, 9], "addit": [1, 2, 10], "special": 1, "add": [1, 2, 7, 8, 10, 11], "us": [1, 2, 5, 6, 7, 10], "notif": 1, "forward": 1, "get": [1, 2, 3, 9, 11], "from": [1, 2, 6, 7, 10], "server": [1, 2, 3, 7, 8, 9, 10, 11], "respons": 1, "duplic": [1, 2], "group": [1, 9], "rout": [1, 2], "found": [1, 7, 9, 10, 11], "rule_config": [1, 7, 10], "three": [1, 3, 9], "repres": 1, "tree": 1, "most": [1, 2, 7, 11], "win": [1, 6], "inhibit": 1, "mute": 1, "base": [1, 2, 7, 9, 10, 11], "anoth": [1, 10], "receiv": [1, 2], "via": [1, 6], "sluck": 1, "etc": [1, 7, 9, 10, 11], "check": [1, 2, 6], "document": [1, 6, 9, 11], "detail": 1, "specifi": [1, 6, 9, 10, 11], "tabl": [1, 2, 4, 9], "It": [1, 8, 9, 10, 11], "": [1, 2, 9, 10, 11], "wors": 1, "have": [1, 5, 6, 7, 9, 10, 11], "doe": [1, 2, 5, 6, 7, 9, 10, 11], "work": [1, 9, 10, 11], "all": [1, 2, 3, 6, 8, 9, 11], "There": [1, 7, 9, 11], "multipl": [1, 2, 9, 10, 11], "wai": [1, 2, 6, 10], "make": [1, 2, 6, 7, 9, 10, 11], "sure": [1, 2, 6, 7, 9, 11], "your": [1, 2, 6, 7, 8, 9, 10, 11], "correctli": [1, 11], "start": [1, 3, 7, 11], "path": [1, 7, 9, 10], "mail": 1, "simpl": 1, "negat": 1, "logic": 1, "forc": 1, "reduc": [1, 11], "limit": [1, 2, 9], "possibl": [1, 2, 8, 10], "simul": 1, "actual": 1, "scenario": 1, "see": [1, 2, 3, 5, 6, 7, 8, 9, 11], "expect": [1, 11], "low": [1, 2], "avail": [1, 2, 7, 9, 11], "disk": [1, 6, 10, 11], "space": 1, "assum": [1, 5, 7, 9, 10], "want": [1, 9], "lower": [1, 2], "10": [1, 9, 11], "fire": 1, "That": [1, 10, 11], "would": [1, 2, 7, 9, 11], "show": [1, 2, 4, 11], "propag": 1, "ani": [1, 2, 6, 7, 9, 11], "valu": [1, 2, 11], "similar": [1, 11], "current": [1, 6, 7, 9, 10, 11], "situat": [1, 2, 9, 10], "now": 1, "free": 1, "below": [1, 8, 9], "creat": [1, 2, 6, 7, 9, 10, 11], "some": 1, "big": [1, 2], "help": [1, 2, 7, 10, 11], "bisect": 1, "problem": [1, 2], "identifi": 2, "potenti": 2, "issu": [2, 11], "model": 2, "driver": 2, "upper": 2, "relat": 2, "gaug": 2, "graph": [2, 11], "when": [2, 5, 6, 7, 9, 10, 11], "inspect": 2, "we": [2, 5, 7, 9, 11], "zero": 2, "besid": [2, 10], "intern": [2, 11], "which": [2, 4, 11], "mislead": 2, "test": [2, 6, 7], "traffic": [2, 6], "follow": [2, 4, 5, 6, 7, 9, 10, 11], "section": [2, 5, 6, 7, 9], "describ": [2, 6, 8, 9], "panel": 2, "first": 2, "templat": [2, 6, 7, 9], "place": [2, 9, 10, 11], "holder": 2, "differ": [2, 7, 9, 10, 11], "benefit": 2, "databas": [2, 7, 10], "onli": [2, 9, 10], "need": [2, 5, 6, 7, 9, 10, 11], "pars": [2, 11], "onc": 2, "right": [2, 7, 9, 11], "node": [2, 4, 5, 6, 7, 10], "safer": 2, "prevent": 2, "inject": 2, "non": [2, 6], "percentag": [2, 11], "rate": 2, "both": [2, 6, 7, 9], "distribut": 2, "where": [2, 6, 7, 9, 11], "rang": [2, 6], "ring": 2, "ideal": 2, "reach": [2, 9], "one": [2, 8, 10], "replica": 2, "fail": 2, "do": [2, 6, 9, 10, 11], "mean": [2, 10, 11], "coordin": 2, "result": [2, 9, 10], "higher": [2, 7, 9], "latenc": 2, "increas": 2, "resourc": 2, "usag": [2, 6], "typic": [2, 7, 11], "know": [2, 6, 9], "replic": 2, "load": [2, 6, 7, 9], "balanc": 2, "caus": 2, "did": 2, "break": [2, 11], "chunk": 2, "repli": 2, "size": [2, 11], "requir": 2, "return": [2, 6], "overal": 2, "client": 2, "should": [2, 6, 7, 9, 11], "avoid": [2, 6, 9, 11], "support": [2, 3, 9, 11], "compound": 2, "primari": 2, "kei": 2, "cluster": [2, 5, 7, 9], "column": 2, "kind": 2, "an": [2, 5, 6, 7, 10, 11], "effici": 2, "sort": [2, 11], "order": 2, "BY": 2, "wa": [2, 11], "ineffici": 2, "ks1": 2, "table_demo": 2, "categori": 2, "text": 2, "type": [2, 7, 11], "int": 2, "WITH": 2, "desc": 2, "select": 2, "cat1": 2, "asc": 2, "side": 2, "user": [2, 7, 9, 10], "overhead": 2, "These": 2, "care": 2, "two": [2, 8, 9, 10], "thing": 2, "mani": 2, "exist": [2, 9, 11], "much": 2, "drop": 2, "row": [2, 11], "were": 2, "indic": 2, "match": [2, 9], "reason": [2, 6, 11], "A": [2, 10, 11], "determin": 2, "common": [2, 10], "quorum": 2, "major": 2, "success": 2, "mai": [2, 6], "hurt": 2, "persist": [2, 5, 7, 9, 10], "lost": [2, 9, 10, 11], "cl": 2, "unavail": 2, "oper": 2, "usual": [2, 6, 11], "expens": 2, "term": 2, "cost": 2, "could": 2, "ONE": 2, "perform": [2, 5, 7, 9], "end": [2, 7, 9], "local": [2, 6, 7, 9, 10, 11], "local_quorum": 2, "local_on": 2, "instead": [2, 7, 9], "reli": 2, "definit": [2, 11], "per": [2, 5, 7, 9], "center": [2, 7, 9], "scylla_serv": [2, 6, 7, 9], "If": [2, 6, 7, 9, 10, 11], "nearest": 2, "between": [2, 6], "older": 3, "version": [3, 4, 6, 7, 10, 11], "compon": 3, "wrap": 3, "docker": [3, 6, 10], "collect": [3, 10], "store": [3, 7, 11], "alertmanag": [3, 10], "handl": [3, 9, 10], "choos": [3, 6], "topic": 3, "instal": [3, 6], "sh": [3, 6, 9], "script": [3, 9, 10, 11], "interfac": [3, 6], "deploi": [3, 9], "without": [3, 9, 10, 11], "troubleshoot": 3, "guid": [3, 6, 9], "manag": [3, 4, 7], "integr": 3, "upgrad": 3, "cql": [3, 9], "optim": 3, "ad": [3, 5, 7, 9, 10], "modifi": 3, "matrix": 3, "lesson": 3, "univers": 3, "enterpris": [4, 11], "node_export": [4, 6, 7, 9, 10], "1": [4, 7, 9, 10, 11], "5": [4, 5, 6, 7, 9, 11], "2019": 4, "2020": 4, "17": [4, 6, 7, 9], "2018": [4, 11], "14": [4, 6], "agent": [4, 6, 9, 10], "run": [4, 6, 7, 9, 10, 11], "o": [4, 10], "cpu": [5, 7, 9], "least": [5, 7, 9], "physic": [5, 7, 9], "core": [5, 7, 9], "4vcpu": [5, 7, 9], "memori": [5, 7, 9], "15gb": [5, 7, 9], "dram": [5, 7, 9], "storag": [5, 7, 9, 10, 11], "proport": [5, 7, 9], "number": [5, 7, 9], "retent": [5, 7, 9], "network": [5, 6, 7, 9, 10], "1gbe": [5, 7, 9], "10gbe": [5, 7, 9], "prefer": [5, 6, 7, 9], "block": [5, 7, 9], "volum": [5, 7, 9], "ec2": [5, 7, 9], "eb": [5, 7, 9], "15": [5, 7, 9], "dai": [5, 7, 9, 10], "around": [5, 6, 7, 9], "200mb": [5, 7, 9], "scrape": [5, 7, 9], "interv": [5, 7, 9], "6": [5, 7, 9, 11], "16": [5, 6, 7, 9], "20gb": [5, 7, 9], "To": [5, 7, 8, 9, 11], "account": [5, 7, 9], "unexpect": [5, 7, 9], "event": [5, 7, 9], "replac": [5, 7, 9, 11], "alloc": [5, 7, 9], "x4": [5, 7, 9], "100gb": [5, 7, 9], "fast": [5, 7, 9], "enough": [5, 7, 9], "provid": [5, 7, 9], "out": [5, 7, 9], "box": [5, 7, 9], "step": [6, 7, 11], "done": [6, 9, 10, 11], "chang": [6, 8, 10, 11], "port": [6, 7, 8, 9, 10], "56090": [6, 7], "5090": [6, 9], "backward": [6, 11], "compat": [6, 11], "old": 6, "new": [6, 9], "updat": [6, 7, 11], "scylla_manager_serv": [6, 7, 9], "twice": 6, "easiest": 6, "edit": [6, 7, 9, 10, 11], "remov": 6, "scylla_manager1": 6, "job": [6, 9], "note": [6, 7, 9, 10], "take": [6, 10, 11], "effect": [6, 11], "kill": [6, 9], "messag": 6, "wait": 6, "log": [6, 9], "aprom": 6, "failur": 6, "root": [6, 9], "post": 6, "becaus": [6, 10], "own": [6, 9, 10], "proper": 6, "past": 6, "ownership": 6, "prom": 6, "cento": [6, 7], "l": [6, 9, 10], "la": 6, "grep": 6, "drwxr": 6, "xr": 6, "x": [6, 11], "4096": 6, "jun": 6, "25": 6, "51": 6, "sudo": [6, 7, 9], "chown": 6, "r": [6, 7, 10, 11], "appear": 6, "unreach": 6, "immedi": 6, "suspect": 6, "connect": [6, 8, 11], "login": [6, 9], "consol": [6, 7], "browser": [6, 7, 9, 11], "http": [6, 7, 9], "ip": [6, 7, 8, 9, 10], "9090": [6, 7], "address": [6, 7, 8, 9, 10], "go": [6, 9], "target": [6, 7, 8, 10, 11], "tab": 6, "127": [6, 7, 10], "insid": [6, 7, 9, 10, 11], "host": [6, 7, 9, 10], "try": [6, 7], "flag": [6, 9, 10, 11], "enabl": [6, 9], "confirm": 6, "pull": [6, 9], "align": 6, "v": [6, 9, 10, 11], "option": [6, 9], "procedur": [6, 7, 9], "On": 6, "p": [6, 7, 10], "id": [6, 11], "imag": 6, "command": [6, 9], "statu": [6, 9], "41bd3db26240": 6, "entrypoin": 6, "ago": 6, "23": 6, "7000": [6, 9], "7001": 6, "tcp": 6, "9042": 6, "9160": 6, "9180": [6, 7, 8, 9], "10000": 6, "gui": [6, 10, 11], "click": 6, "fetch": 6, "curl": 6, "scylla_nod": 6, "binari": [6, 9], "firewal": [6, 9], "172": [6, 7, 9], "machin": [6, 9, 10], "ef": 6, "gre": 6, "scylla_setup": 6, "9100": 6, "pleas": [6, 7], "while": 6, "servic": [6, 7, 9], "manual": 6, "captur": 6, "tshark": 6, "f": 6, "dst": 6, "eth0": 6, "toward": 6, "199": 6, "203": 6, "229": 6, "89": 6, "12": [6, 11], "142": 6, "66": [6, 7], "59212": 6, "ack": 6, "seq": 6, "317": 6, "78193": 6, "158080": 6, "len": 6, "tsval": 6, "79869679": 6, "tsecr": 6, "3347447210": 6, "74": 6, "60440": 6, "syn": 6, "29200": 6, "mss": 6, "1460": 6, "sack_perm": 6, "79988291": 6, "w": [6, 11], "128": 6, "instruct": 7, "main": 7, "item": 7, "indefinit": 7, "accru": 7, "solut": 7, "churn": 7, "7": [7, 9, 11], "download": [7, 9], "latest": [7, 9, 10], "releas": 7, "wget": [7, 9], "github": [7, 9], "com": [7, 9], "scylladb": [7, 9], "archiv": [7, 9], "tar": [7, 9], "gz": [7, 9], "xvf": [7, 9], "20": 7, "v0": 7, "linux": 7, "amd64": 7, "copi": 7, "cp": 7, "home": 7, "cd": [7, 9], "verifi": 7, "point": [7, 9, 11], "192": [7, 9], "168": [7, 9], "135": 7, "166": 7, "9093": 7, "18": 7, "v2": 7, "correct": 7, "static": 7, "honor_label": 7, "fals": [7, 11], "paramet": [7, 10], "vi": 7, "alertmang": 7, "am_address": 7, "same": [7, 9], "static_config": [7, 9], "manager_ag": 7, "config": [7, 10], "global": [7, 9], "scrape_interv": [7, 9], "everi": [7, 9, 10], "scrape_timeout": 7, "timeout": 7, "scape": 7, "again": [7, 9], "attach": 7, "seri": 7, "commun": 7, "feder": 7, "remot": 7, "external_label": 7, "scrape_config": 7, "job_nam": [7, 9], "file_sd_config": 7, "relabel_config": 7, "source_label": 7, "__address__": 7, "regex": 7, "target_label": 7, "node_exporter_serv": [7, 9], "those": 7, "under": [7, 9], "must": [7, 9], "even": [7, 9, 10], "cat": 7, "list": [7, 9], "244": 7, "cluster1": [7, 9], "dc": [7, 9], "dc1": [7, 9], "dc2": [7, 9], "previou": 7, "deprec": 7, "mkdir": 7, "mydata": 7, "tsdb": [7, 10], "accumul": 7, "visibl": 7, "execut": 7, "queri": 7, "through": 7, "node_memory_memfre": 7, "And": 7, "scylla_reactor_util": 7, "At": [7, 11], "emit": 7, "abl": 7, "grafna": 7, "depend": 7, "repositori": [7, 9], "yum": 7, "zip": 7, "structur": 7, "rest": 7, "access": [7, 10], "plugin": 7, "var": 7, "lib": 7, "packag": 7, "public": 7, "app": 7, "provis": [7, 9, 11], "yaml": [7, 8, 9], "build": 7, "conf": 7, "manager_2": 7, "ver_4": 7, "folder": 7, "datasourc": [7, 9, 11], "apivers": 7, "url": 7, "167": 7, "proxi": 7, "basicauth": 7, "camptocamp": 7, "orgid": 7, "typelogourl": 7, "img": 7, "icn": 7, "svg": 7, "password": [7, 9, 10], "isdefault": 7, "jsondata": 7, "severity_crit": 7, "severity_high": 7, "severity_warn": 7, "severity_info": 7, "sampl": 7, "ini": 7, "reflect": 7, "bin": 7, "3000": [7, 9], "assumpt": 7, "colloc": 7, "expos": 8, "onlin": 8, "listen": [8, 9, 10], "request": [8, 10], "inform": [8, 9, 10, 11], "api": [8, 10], "disabl": [8, 9], "prometheus_port": 8, "bind": [8, 10], "restrict": 8, "prometheus_address": 8, "setup": 9, "dedic": 9, "over": 9, "evalu": 9, "laptop": 9, "altern": 9, "groupadd": 9, "next": [9, 10], "usermod": 9, "ag": 9, "call": [9, 10], "systemctl": 9, "extract": 9, "As": [9, 11], "clone": 9, "git": 9, "directli": 9, "checkout": 9, "branch": 9, "restart": [9, 10], "wish": [9, 10], "import": [9, 10], "datacent": 9, "nodetool": 9, "valid": 9, "ipv6": 9, "squar": 9, "bracket": 9, "2600": 9, "1f18": 9, "26b1": 9, "3a00": 9, "fac8": 9, "118e": 9, "9199": 9, "67b9": 9, "67ba": 9, "web": 9, "overrid": [9, 10, 11], "pass": [9, 10], "n": [9, 10], "my_scylla_serv": 9, "d": [9, 10], "prometheus_data": 9, "mark": 9, "seen": 9, "its": [9, 10, 11], "genconfig": 9, "py": [9, 11], "myconf": 9, "four": 9, "OR": 9, "line": [9, 10, 11], "protect": 9, "author": [9, 10], "assign": 9, "keyspac": 9, "uncom": 9, "securejsondata": 9, "outsid": [9, 10], "permiss": 9, "somewher": 9, "els": [9, 10], "either": 9, "myservic": 9, "m": [9, 10], "master": 9, "authent": [9, 10], "admin": [9, 10], "simplest": 10, "small": 10, "util": [10, 11], "appropri": 10, "h": [10, 11], "print": 10, "exit": 10, "applic": 10, "localhost": 10, "cannot": 10, "map": 10, "explicit": 10, "encapsul": 10, "param": 10, "allow": 10, "g": 10, "dir": 10, "keep": 10, "clear": 10, "comma": 10, "separ": 10, "j": 10, "c": 10, "environ": 10, "variabl": 10, "alter": 10, "q": 10, "anonym": 10, "role": 10, "privileg": 10, "behavior": 10, "editor": 10, "viewer": 10, "suppli": [10, 11], "product": 10, "b": 10, "relev": 10, "consul": 10, "resolv": 10, "ignor": 10, "explicitli": [10, 11], "week": 10, "opportun": 10, "demonstr": 10, "cover": 10, "30d": 10, "arbitrari": 10, "explain": 11, "whenev": 11, "gone": 11, "save": 11, "mention": 11, "earlier": 11, "overridden": 11, "perman": 11, "eventu": 11, "made": 11, "larg": 11, "suggest": 11, "maintain": 11, "why": 11, "json": 11, "too": 11, "verbos": 11, "element": 11, "object": 11, "attribut": 11, "aliascolor": 11, "bar": 11, "true": 11, "error": 11, "fill": 11, "grid": 11, "threshold1": 11, "null": 11, "threshold1color": 11, "rgba": 11, "216": 11, "200": 11, "27": 11, "threshold2": 11, "threshold2color": 11, "234": 11, "112": 11, "22": 11, "gridpo": 11, "y": 11, "isnew": 11, "legend": 11, "avg": 11, "max": 11, "min": 11, "total": 11, "linewidth": 11, "link": 11, "nullpointmod": 11, "pointradiu": 11, "render": 11, "flot": 11, "seriesoverrid": 11, "span": 11, "steppedlin": 11, "sum": 11, "node_filesystem_avail": 11, "intervalfactor": 11, "legendformat": 11, "refid": 11, "timefrom": 11, "timeshift": 11, "titl": 11, "tooltip": 11, "msresolut": 11, "share": 11, "value_typ": 11, "cumul": 11, "transpar": 11, "xaxi": 11, "yax": 11, "percent": 11, "logbas": 11, "101": 11, "short": 11, "imagin": 11, "redund": 11, "resembl": 11, "css": 11, "hierarch": 11, "inherit": 11, "base_row": 11, "collaps": 11, "height": 11, "250px": 11, "150px": 11, "output": 11, "bytes_panel": 11, "byte": 11, "unit": 11, "axi": 11, "adjust": 11, "themselv": 11, "readabl": 11, "e": 11, "gb": 11, "mb": 11, "grasp": 11, "origin": 11, "larger": 11, "later": 11, "longer": 11, "absolut": 11, "posit": 11, "ie": 11, "width": 11, "ve": 11, "had": 11, "imposs": 11, "hand": 11, "overcom": 11, "transit": 11, "calcul": 11, "taken": 11, "stil": 11, "partial": 11, "24": 11, "don": 11, "t": 11, "python": 11, "make_dashboard": 11, "revers": 11, "singl": 11, "easier": 11, "wrapper": 11, "re": 11, "just": 11, "refresh": 11, "after": 11, "generate_gener": 11, "mayb": 11}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"alert": [1, 10], "prometheu": [1, 5, 7, 8, 9, 10], "alertmanag": [1, 7], "tip": 1, "when": 1, "ad": [1, 11], "an": [1, 9], "The": [2, 10, 11], "cql": 2, "optim": 2, "prepar": 2, "statement": 2, "token": 2, "awar": 2, "page": 2, "queri": 2, "revers": 2, "read": 2, "allow": 2, "filter": 2, "consist": [2, 11], "level": [2, 6], "cross": 2, "dc": 2, "request": 2, "scylla": [3, 4, 6, 7, 9], "monitor": [3, 4, 6, 7, 8, 9], "support": [4, 10], "matrix": 4, "minim": [5, 7, 9], "product": [5, 7, 9], "system": [5, 7, 9, 11], "recommend": [5, 7, 9], "calcul": [5, 7, 9], "disk": [5, 7, 9], "space": [5, 7, 9], "requir": [5, 7, 9], "troubleshoot": 6, "problem": 6, "manag": [6, 9, 10], "2": 6, "duplic": 6, "inform": 6, "A": 6, "contain": 6, "fail": 6, "To": 6, "start": [6, 9, 10], "file": [6, 9], "And": 6, "directori": [6, 9], "permiss": 6, "No": 6, "data": [6, 9], "point": 6, "solut": 6, "grafana": [6, 7, 9, 10, 11], "chart": 6, "show": 6, "error": 6, "sign": 6, "server": 6, "metric": 6, "notic": 6, "user": 6, "upgrad": [6, 11], "open": 6, "sourc": 6, "3": 6, "0": 6, "enterpris": 6, "2019": 6, "1": 6, "work": 6, "wireshark": 6, "deploi": 7, "without": 7, "docker": [7, 9], "instal": [7, 9], "interfac": 8, "stack": 9, "prerequisit": [9, 11], "post": 9, "configur": 9, "node": 9, "from": [9, 11], "us": [9, 11], "consul": 9, "api": 9, "connect": 9, "extern": 9, "add": 9, "addit": 9, "target": 9, "stop": 9, "specif": 9, "version": 9, "access": 9, "localhost": 9, "view": 9, "dashboard": [9, 11], "all": 10, "sh": [10, 11], "command": 10, "gener": [10, 11], "option": 10, "relat": 10, "ldap": 10, "retent": 10, "period": 10, "modifi": 11, "limit": 11, "between": 11, "restart": 11, "templat": 11, "class": 11, "panel": 11, "exampl": 11, "format": 11, "layout": 11, "valid": 11}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"The CQL Optimization": [[2, "the-cql-optimization"]], "Prepared Statements": [[2, "prepared-statements"]], "Token Aware": [[2, "token-aware"]], "Paged Queries": [[2, "paged-queries"]], "Reversed CQL Reads": [[2, "reversed-cql-reads"]], "ALLOW FILTERING": [[2, "allow-filtering"]], "Consistency Level": [[2, "consistency-level"]], "Cross DC": [[2, "cross-dc"]], "Cross DC Consistency Level": [[2, "cross-dc-consistency-level"]], "Cross DC read requests": [[2, "cross-dc-read-requests"]], "Alerting": [[1, "alerting"]], "Prometheus Alerts": [[1, "prometheus-alerts"]], "Alertmanager": [[1, "alertmanager"]], "Tips When Adding an Alert": [[1, "tips-when-adding-an-alert"]], "Scylla Monitor Support Matrix": [[4, "scylla-monitor-support-matrix"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [7, "minimal-production-system-recommendations"], [9, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [7, "calculating-prometheus-minimal-disk-space-requirement"], [9, "calculating-prometheus-minimal-disk-space-requirement"]], "Scylla Monitor": [[3, "scylla-monitor"]], "Monitoring Interfaces": [[8, "monitoring-interfaces"]], "Prometheus": [[8, "prometheus"]], "Deploying Scylla Monitoring Without Docker": [[7, "deploying-scylla-monitoring-without-docker"]], "Install Scylla Monitor": [[7, "install-scylla-monitor"]], "Install Alertmanager": [[7, "install-alertmanager"]], "Install Prometheus": [[7, "install-prometheus"]], "Install Grafana": [[7, "install-grafana"]], "Troubleshoot Monitoring": [[6, "troubleshoot-monitoring"]], "Problem": [[6, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[6, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[6, "a-container-fails-to-start"]], "Files And Directory Permissions": [[6, "files-and-directory-permissions"]], "No Data Points": [[6, "no-data-points"]], "Solution": [[6, "solution"], [6, "id1"], [6, "id2"], [6, "id3"]], "Grafana Chart Shows Error (!) Sign": [[6, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[6, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[6, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[6, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[6, "working-with-wireshark"]], "The start-all.sh command": [[10, "the-start-all-sh-command"]], "General Options": [[10, "general-options"]], "Grafana Related Commands": [[10, "grafana-related-commands"]], "Grafana LDAP support": [[10, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[10, "prometheus-related-commands"]], "Prometheus Retention Period": [[10, "prometheus-retention-period"]], "Alert Manager": [[10, "alert-manager"]], "Install Scylla Monitoring Stack": [[9, "install-scylla-monitoring-stack"]], "Prerequisites": [[9, "prerequisites"]], "Docker Post Installation": [[9, "docker-post-installation"]], "Install Scylla Monitoring": [[9, "install-scylla-monitoring"]], "Configure Scylla Monitoring": [[9, "configure-scylla-monitoring"]], "Configure Scylla nodes from files": [[9, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[9, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[9, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[9, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[9, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[9, "start-and-stop-scylla-monitoring-stack"]], "Start": [[9, "start"]], "Stop": [[9, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[9, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[9, "accessing-the-localhost"]], "View Grafana Dashboards": [[9, "view-grafana-dashboards"]], "Adding and Modifying Dashboards": [[11, "adding-and-modifying-dashboards"]], "General Limitations": [[11, "general-limitations"]], "consistency between restarts": [[11, "consistency-between-restarts"]], "consistency between upgrades": [[11, "consistency-between-upgrades"]], "Using templated Dashboards": [[11, "using-templated-dashboards"]], "The template class system": [[11, "the-template-class-system"]], "Panel example": [[11, "panel-example"]], "Grafana Formats and Layouts": [[11, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[11, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "prerequisite": [[11, "prerequisite"]], "Validation": [[11, "validation"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.5/sitemap.xml b/branch-3.5/sitemap.xml new file mode 100644 index 000000000..20c4498ef --- /dev/null +++ b/branch-3.5/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.5/start_all.html b/branch-3.5/start_all.html new file mode 100644 index 000000000..5b7f346e6 --- /dev/null +++ b/branch-3.5/start_all.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          The start-all.sh command

          +

          Scylla Monitor is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

          +

          The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

          +
          +

          General Options

          +

          -h Help, Print the help, and exit.

          +

          –version print the current Scylla-Monitoring stack version, and exit.

          +

          -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

          +

          -A bind-to-ip-address Bind the listening-address to an explicit IP address.

          +

          -D encapsulate docker param Allows passing additional parameters to all the docker containers.

          +
          + + +
          +

          Alert Manager

          +

          alertmanager handles the alerts and takes the following parameters:

          +

          -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

          +

          -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

          +

          -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.5/updating_dashboard.html b/branch-3.5/updating_dashboard.html new file mode 100644 index 000000000..b5bf91a13 --- /dev/null +++ b/branch-3.5/updating_dashboard.html @@ -0,0 +1,878 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +
          +

          Adding and Modifying Dashboards

          +

          The following document explains how to update or create Grafana dashboards for the Scylla Monitor.

          +

          It will explain about Scylla Monitor dashboard templates and how to modify them.

          +
          +

          General Limitations

          +

          Scylla Monitor uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

          +
          +

          consistency between restarts

          +

          By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitor (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

          +
          +
          +

          consistency between upgrades

          +

          As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

          +
          +

          Note

          +

           You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

          +
          +

          At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

          +
          +
          +
          +

          Using templated Dashboards

          +

          Why does Scylla Monitor use dashboard templates?

          +

          We found the Grafana dashboards Json format too verbose to be maintainable.

          +

          Each element in the dashboard file (Each Json object) contains all of its attributes and values.

          +

          For example a typical graph panel would look like:

          +
          {
          +    "aliasColors": {},
          +    "bars": false,
          +    "datasource": "prometheus",
          +    "editable": true,
          +    "error": false,
          +    "fill": 0,
          +    "grid": {
          +        "threshold1": null,
          +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
          +        "threshold2": null,
          +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
          +    },
          +    "gridPos": {
          +        "h": 6,
          +        "w": 10,
          +        "x": 0,
          +        "y": 4
          +    },
          +    "id": 2,
          +    "isNew": true,
          +    "legend": {
          +        "avg": false,
          +        "current": false,
          +        "max": false,
          +        "min": false,
          +        "show": false,
          +        "total": false,
          +        "values": false
          +    },
          +    "lines": true,
          +    "linewidth": 2,
          +    "links": [],
          +    "nullPointMode": "connected",
          +    "percentage": false,
          +    "pointradius": 5,
          +    "points": false,
          +    "renderer": "flot",
          +    "seriesOverrides": [
          +        {}
          +    ],
          +    "span": 5,
          +    "stack": false,
          +    "steppedLine": false,
          +    "targets": [
          +        {
          +            "expr": "sum(node_filesystem_avail) by (instance)",
          +            "intervalFactor": 1,
          +            "legendFormat": "",
          +            "refId": "A",
          +            "step": 1
          +        }
          +    ],
          +    "timeFrom": null,
          +    "timeShift": null,
          +    "title": "Available Disk Size",
          +    "tooltip": {
          +        "msResolution": false,
          +        "shared": true,
          +        "sort": 0,
          +        "value_type": "cumulative"
          +    },
          +    "transparent": false,
          +    "type": "graph",
          +    "xaxis": {
          +        "show": true
          +    },
          +    "yaxes": [
          +        {
          +            "format": "percent",
          +            "logBase": 1,
          +            "max": 101,
          +            "min": 0,
          +            "show": true
          +        },
          +        {
          +            "format": "short",
          +            "logBase": 1,
          +            "max": null,
          +            "min": null,
          +            "show": true
          +        }
          +    ]
          +}
          +
          +
          +

          As you can imagine, most panels would have similar values.

          +

          To reduce the redundancy of Grafana JSON format, we added dashboard templates.

          +
          +

          The template class system

          +

          Scylla Monitor dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

          +

          The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

          +

          In the template file, you can also add or override attributes.

          +

          The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

          +

          When generating dashboards, each class will be replaced by its definition.

          +

          For example row in the type.json defined

          +
          {
          + "base_row": {
          +     "collapse": false,
          +     "editable": true
          + },
          + "row": {
          +     "class": "base_row",
          +     "height": "250px"
          + }
          + }
          +
          +
          +

          In a Template it will be used like

          +
          {
          +     "class": "row",
          +     "height": "150px",
          +     "panels": [
          +     ]
          +}
          +
          +
          +

          The output will be

          +
          {
          +     "class": "row",
          +     "collapse": false,
          +     "editable": true,
          +     "height": "150px",
          +     "panels": [
          +
          +     ]
          +}
          +
          +
          +

          We can see that the template added the panels attribute and override the height attribute.

          +
          +
          +

          Panel example

          +

          Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

          +
          {
          +     "class": "row",
          +     "panels": [
          +         {
          +             "class": "bytes_panel",
          +             "span": 3,
          +             "targets": [
          +                 {
          +                     "expr": "sum(node_filesystem_avail) by (instance)",
          +                     "intervalFactor": 1,
          +                     "legendFormat": "",
          +                     "metric": "",
          +                     "refId": "A",
          +                     "step": 1
          +                 }
          +             ],
          +             "title": "Available Disk Size"
          +         }
          +     ]
          +}
          +
          +
          +

          In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

          +

          You can also see that we override the span attribute to set the panel size.

          +

          To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

          +
          +
          +

          Grafana Formats and Layouts

          +

          The Grafana layout used to be based on rows, where each contains multiple panels. +Each row would have a total span of 12, if the total span of the panels be larger than 12, it would +break the lines into multiple lines.

          +

          Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

          +

          The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

          +

          To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

          +

          Panels height will be taken from their row. The span attribute is stil supported like you expect it to work, so does row height.

          +

          you can use the gridPos attribute which is a Grafana 5.0 format, but not like Grafana, you can use partial attributes.

          +

          gridPos has the following attributes:

          +
          {
          +   "x": 0,
          +   "y": 0,
          +   "w": 24,
          +   "h": 4
          + }
          +
          +
          +

          When using Scylla’s template you don’t need to supply them all, so for example to specify that a row is 2 units height you can use:

          +
          {
          +   "gridPos": {
          +      "h": 2
          +    }
          +}
          +
          +
          +
          +
          +

          Generating the dashboards from templates (generate-dashboards.sh)

          +
          +

          prerequisite

          +

          Python 2.7

          +

          make_dashboards.py is a utility that generates dashboards from templates or help you update the template when working in reverse mode (the -r flag).

          +

          Use the -h flag to get help information.

          +

          You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

          +

          When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +this will replace your existing dashboards.

          +

          For example, if you are changing a dashboard in Scylla Enterprise version 2018.1 run:

          +

          .\generate-dashboards.sh -v 2018.1

          +
          +

          Note

          +

          generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

          +
          +
          +
          +
          +

          Validation

          +

          After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

          +

          Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

          +
          +
          +
          + + +
          + + + + + + + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.6/.buildinfo b/branch-3.6/.buildinfo new file mode 100644 index 000000000..80ac710fc --- /dev/null +++ b/branch-3.6/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 1c545562cd8f465f681e188aa9428de6 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.6/.doctrees/_common/monitor-description.doctree b/branch-3.6/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..a4364e15d Binary files /dev/null and b/branch-3.6/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.6/.doctrees/advisor.doctree b/branch-3.6/.doctrees/advisor.doctree new file mode 100644 index 000000000..c94f24434 Binary files /dev/null and b/branch-3.6/.doctrees/advisor.doctree differ diff --git a/branch-3.6/.doctrees/alerting.doctree b/branch-3.6/.doctrees/alerting.doctree new file mode 100644 index 000000000..c3cf52c61 Binary files /dev/null and b/branch-3.6/.doctrees/alerting.doctree differ diff --git a/branch-3.6/.doctrees/cql_optimization.doctree b/branch-3.6/.doctrees/cql_optimization.doctree new file mode 100644 index 000000000..97c893bd2 Binary files /dev/null and b/branch-3.6/.doctrees/cql_optimization.doctree differ diff --git a/branch-3.6/.doctrees/docker_compose.doctree b/branch-3.6/.doctrees/docker_compose.doctree new file mode 100644 index 000000000..f08eedfc0 Binary files /dev/null and b/branch-3.6/.doctrees/docker_compose.doctree differ diff --git a/branch-3.6/.doctrees/environment.pickle b/branch-3.6/.doctrees/environment.pickle new file mode 100644 index 000000000..70828eeba Binary files /dev/null and b/branch-3.6/.doctrees/environment.pickle differ diff --git a/branch-3.6/.doctrees/index.doctree b/branch-3.6/.doctrees/index.doctree new file mode 100644 index 000000000..fdbd086c6 Binary files /dev/null and b/branch-3.6/.doctrees/index.doctree differ diff --git a/branch-3.6/.doctrees/matrix.doctree b/branch-3.6/.doctrees/matrix.doctree new file mode 100644 index 000000000..6a0a9be78 Binary files /dev/null and b/branch-3.6/.doctrees/matrix.doctree differ diff --git a/branch-3.6/.doctrees/min-prod-hw.doctree b/branch-3.6/.doctrees/min-prod-hw.doctree new file mode 100644 index 000000000..b865b934a Binary files /dev/null and b/branch-3.6/.doctrees/min-prod-hw.doctree differ diff --git a/branch-3.6/.doctrees/monitor_troubleshoot.doctree b/branch-3.6/.doctrees/monitor_troubleshoot.doctree new file mode 100644 index 000000000..90ddf249a Binary files /dev/null and b/branch-3.6/.doctrees/monitor_troubleshoot.doctree differ diff --git a/branch-3.6/.doctrees/monitor_without_docker.doctree b/branch-3.6/.doctrees/monitor_without_docker.doctree new file mode 100644 index 000000000..ebcd4631f Binary files /dev/null and b/branch-3.6/.doctrees/monitor_without_docker.doctree differ diff --git a/branch-3.6/.doctrees/monitoring_apis.doctree b/branch-3.6/.doctrees/monitoring_apis.doctree new file mode 100644 index 000000000..5f231e3f8 Binary files /dev/null and b/branch-3.6/.doctrees/monitoring_apis.doctree differ diff --git a/branch-3.6/.doctrees/monitoring_stack.doctree b/branch-3.6/.doctrees/monitoring_stack.doctree new file mode 100644 index 000000000..62c3d3f27 Binary files /dev/null and b/branch-3.6/.doctrees/monitoring_stack.doctree differ diff --git a/branch-3.6/.doctrees/start_all.doctree b/branch-3.6/.doctrees/start_all.doctree new file mode 100644 index 000000000..77d3adb0f Binary files /dev/null and b/branch-3.6/.doctrees/start_all.doctree differ diff --git a/branch-3.6/.doctrees/thanos.doctree b/branch-3.6/.doctrees/thanos.doctree new file mode 100644 index 000000000..dc3c977aa Binary files /dev/null and b/branch-3.6/.doctrees/thanos.doctree differ diff --git a/branch-3.6/.doctrees/updating_dashboard.doctree b/branch-3.6/.doctrees/updating_dashboard.doctree new file mode 100644 index 000000000..5b368497b Binary files /dev/null and b/branch-3.6/.doctrees/updating_dashboard.doctree differ diff --git a/branch-3.6/.nojekyll b/branch-3.6/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.6/404.html b/branch-3.6/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.6/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
          +

          404

          +

          The ScyllaDB monster ate your page!

          +

          + Home +

          +
          + + + \ No newline at end of file diff --git a/branch-3.6/CNAME b/branch-3.6/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.6/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.6/_common/monitor-description.html b/branch-3.6/_common/monitor-description.html new file mode 100644 index 000000000..232323d93 --- /dev/null +++ b/branch-3.6/_common/monitor-description.html @@ -0,0 +1,593 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + + + +
          +
          + Menu +
          +
          +
          +
          +
          + + +
          +

          Caution

          +

          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

          +
          + + + +
          + +
          + +

          Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

          + + +
          + + + + + +
          + + +
          + +
          + +
          + + + + +
          + + + + + + + \ No newline at end of file diff --git a/branch-3.6/_images/1.png b/branch-3.6/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.6/_images/1.png differ diff --git a/branch-3.6/_images/2.png b/branch-3.6/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.6/_images/2.png differ diff --git a/branch-3.6/_images/3.png b/branch-3.6/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.6/_images/3.png differ diff --git a/branch-3.6/_images/advisor_panel.png b/branch-3.6/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.6/_images/advisor_panel.png differ diff --git a/branch-3.6/_images/alertmanager.png b/branch-3.6/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.6/_images/alertmanager.png differ diff --git a/branch-3.6/_images/cql_optimization_master.png b/branch-3.6/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.6/_images/cql_optimization_master.png differ diff --git a/branch-3.6/_images/grafana.png b/branch-3.6/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.6/_images/grafana.png differ diff --git a/branch-3.6/_images/monitor.png b/branch-3.6/_images/monitor.png new file mode 100644 index 000000000..56c383e46 Binary files /dev/null and b/branch-3.6/_images/monitor.png differ diff --git a/branch-3.6/_images/monitoring_stack.png b/branch-3.6/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.6/_images/monitoring_stack.png differ diff --git a/branch-3.6/_sources/_common/monitor-description.rst.txt b/branch-3.6/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.6/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.6/_sources/advisor.rst.txt b/branch-3.6/_sources/advisor.rst.txt new file mode 100644 index 000000000..ecbaad29d --- /dev/null +++ b/branch-3.6/_sources/advisor.rst.txt @@ -0,0 +1,21 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ +.. figure:: advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. \ No newline at end of file diff --git a/branch-3.6/_sources/alerting.rst.txt b/branch-3.6/_sources/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.6/_sources/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.6/_sources/cql_optimization.rst.txt b/branch-3.6/_sources/cql_optimization.rst.txt new file mode 100644 index 000000000..eafc82e4b --- /dev/null +++ b/branch-3.6/_sources/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.6/_sources/docker_compose.rst.txt b/branch-3.6/_sources/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.6/_sources/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.6/_sources/index.rst.txt b/branch-3.6/_sources/index.rst.txt new file mode 100644 index 000000000..63fa77814 --- /dev/null +++ b/branch-3.6/_sources/index.rst.txt @@ -0,0 +1,53 @@ +Scylla Monitoring Stack +======================= + +.. toctree:: + :hidden: + :maxdepth: 2 + + Install Scylla Monitoring Stack + The start-all.sh script + Running using Docker Compose + Scylla Monitoring Stack Interfaces + Deploy Scylla Monitoring Stack Without Docker + Troubleshoot the Monitoring Stack + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + Upgrade Guide for Scylla Monitor + CQL Optimization Dashboard + Scylla Monitoring Stack Advisor + Adding and Modifying Dashboards + Alerting + Using Thanos + Scylla Monitoring Stack Support Matrix + + +.. include:: /_common/monitor-description.rst + +For older versions of Scylla Monitoring Stack see `here `_. + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Running using Docker Compose ` +* :doc:`Scylla Monitoring Stack Interfaces ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Troubleshoot Scylla Monitoring Stack ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitoring Stack Integration `_ +* `Upgrade Guide for Scylla Monitoring Stack `_ +* :doc:`Scylla Monitoring Stack Advisor ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Alerting ` +* :doc:`Using Thanos ` +* :doc:`Scylla Monitoring Stack Support Matrix ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + diff --git a/branch-3.6/_sources/matrix.rst.txt b/branch-3.6/_sources/matrix.rst.txt new file mode 100644 index 000000000..22cd230d2 --- /dev/null +++ b/branch-3.6/_sources/matrix.rst.txt @@ -0,0 +1,90 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.6.3 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.0 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.6/_sources/min-prod-hw.rst.txt b/branch-3.6/_sources/min-prod-hw.rst.txt new file mode 100644 index 000000000..db5d9c860 --- /dev/null +++ b/branch-3.6/_sources/min-prod-hw.rst.txt @@ -0,0 +1,24 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need **minimal** disk space of + +.. code:: + + 6 * 16 * 200MB ~ 20GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. diff --git a/branch-3.6/_sources/monitor_troubleshoot.rst.txt b/branch-3.6/_sources/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..2cc1457ea --- /dev/null +++ b/branch-3.6/_sources/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.6/_sources/monitor_without_docker.rst.txt b/branch-3.6/_sources/monitor_without_docker.rst.txt new file mode 100644 index 000000000..85e9a2db9 --- /dev/null +++ b/branch-3.6/_sources/monitor_without_docker.rst.txt @@ -0,0 +1,378 @@ +Deploying Scylla Monitoring Stack Without Docker +================================================ + +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. The current monitoring solution does not churn data. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-3.5.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.20.0 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz + tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.20.0.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + + +Install Prometheus +------------------ + +Tested with Prometheus version 2.18.1 + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz + tar -xvf prometheus-2.18.1.linux-amd64.tar.gz + +2. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64 + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml + + +3. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi prometheus-2.18.1.linux-amd64/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +4. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:56090 + +5. Create a data directory for Prometheus to store the metrics data + +For example: + +.. code-block:: shell + + mkdir prometheus-2.18.1.linux-amd64/mydata + + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd prometheus-2.18.1.linux-amd64 + ./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata + +Data should start accumulate on: ./mydata + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + + +Install Grafana +--------------- + +Tested with Grafna 6.7.3 + +1. Install Grafana based on the instructions `here`_ make sure to use version 6.7.0 or higher + +.. _`here` : http://docs.grafana.org/installation/ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.5/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-6.7.3/public/app + +4. Provision the Dashboard them + +For example Scylla version 4.0 and Scylla manager version 2.0 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-6.7.3/public/build/ + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-6.7.3/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.0.yaml`` would point to: ``/home/centos/grafana-6.7.3/public/build/ver_4.0`` and the FOLDER will be ``4.0`` + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-6.7.3/data/plugins + provisioning = /home/centos/grafana-6.7.3/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-6.7.3/ + ./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.6/_sources/monitoring_apis.rst.txt b/branch-3.6/_sources/monitoring_apis.rst.txt new file mode 100644 index 000000000..6d64821bc --- /dev/null +++ b/branch-3.6/_sources/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.6/_sources/monitoring_stack.rst.txt b/branch-3.6/_sources/monitoring_stack.rst.txt new file mode 100644 index 000000000..9d00ebb68 --- /dev/null +++ b/branch-3.6/_sources/monitoring_stack.rst.txt @@ -0,0 +1,355 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Stack Without Docker `_ . + +.. _`docker`: https://docs.docker.com/install/ + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.6 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://scylladb.github.io/scylla-manager/2.2/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.6/_sources/start_all.rst.txt b/branch-3.6/_sources/start_all.rst.txt new file mode 100644 index 000000000..752a98a12 --- /dev/null +++ b/branch-3.6/_sources/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "-storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.6/_sources/thanos.rst.txt b/branch-3.6/_sources/thanos.rst.txt new file mode 100644 index 000000000..ffaf430af --- /dev/null +++ b/branch-3.6/_sources/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912 + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903 + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + \ No newline at end of file diff --git a/branch-3.6/_sources/updating_dashboard.rst.txt b/branch-3.6/_sources/updating_dashboard.rst.txt new file mode 100644 index 000000000..5113102a8 --- /dev/null +++ b/branch-3.6/_sources/updating_dashboard.rst.txt @@ -0,0 +1,302 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It will explain about Scylla Monitoring Stack dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitoring Stack dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.6/_static/basic.css b/branch-3.6/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.6/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.6/_static/check-solid.svg b/branch-3.6/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.6/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.6/_static/clipboard.min.js b/branch-3.6/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.6/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.6/_static/copybutton.css b/branch-3.6/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.6/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

          Short

          + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.6/_static/copybutton.js b/branch-3.6/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.6/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.6/_static/copybutton_funcs.js b/branch-3.6/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.6/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.6/_static/css/main.css b/branch-3.6/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-3.6/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.6/_static/doctools.js b/branch-3.6/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.6/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.6/_static/documentation_options.js b/branch-3.6/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.6/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.6/_static/file.png b/branch-3.6/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.6/_static/file.png differ diff --git a/branch-3.6/_static/img/banner-background.svg b/branch-3.6/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.6/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.6/_static/img/favicon-228x228.png b/branch-3.6/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.6/_static/img/favicon-228x228.png differ diff --git a/branch-3.6/_static/img/favicon-32x32.png b/branch-3.6/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.6/_static/img/favicon-32x32.png differ diff --git a/branch-3.6/_static/img/favicon.ico b/branch-3.6/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.6/_static/img/favicon.ico differ diff --git a/branch-3.6/_static/img/icons/icon-about-team.svg b/branch-3.6/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.6/_static/img/icons/icon-about-us-m.svg b/branch-3.6/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-about-us.svg b/branch-3.6/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-alternator.svg b/branch-3.6/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-apps.svg b/branch-3.6/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-architecture.svg b/branch-3.6/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.6/_static/img/icons/icon-benchmarks.svg b/branch-3.6/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.6/_static/img/icons/icon-blog.svg b/branch-3.6/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.6/_static/img/icons/icon-careers.svg b/branch-3.6/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.6/_static/img/icons/icon-chevron-left.svg b/branch-3.6/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.6/_static/img/icons/icon-chevron-right.svg b/branch-3.6/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.6/_static/img/icons/icon-circe.svg b/branch-3.6/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-clock.svg b/branch-3.6/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-close.svg b/branch-3.6/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-cloud-docs.svg b/branch-3.6/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-cloud.svg b/branch-3.6/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-comparison.svg b/branch-3.6/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.6/_static/img/icons/icon-contact-us.svg b/branch-3.6/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.6/_static/img/icons/icon-developers-blog.svg b/branch-3.6/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.6/_static/img/icons/icon-docs.svg b/branch-3.6/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.6/_static/img/icons/icon-enterprise-m.svg b/branch-3.6/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-enterprise.svg b/branch-3.6/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-events.svg b/branch-3.6/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.6/_static/img/icons/icon-exclamation.svg b/branch-3.6/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-expand.svg b/branch-3.6/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-forum.svg b/branch-3.6/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-getting-started.svg b/branch-3.6/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-glossary.svg b/branch-3.6/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-home.svg b/branch-3.6/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-infoworld.svg b/branch-3.6/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.6/_static/img/icons/icon-integrations.svg b/branch-3.6/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-knowledge-base.svg b/branch-3.6/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-less.svg b/branch-3.6/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-live-test.svg b/branch-3.6/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.6/_static/img/icons/icon-mail-list.svg b/branch-3.6/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-manager.svg b/branch-3.6/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.6/_static/img/icons/icon-memory-management.svg b/branch-3.6/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.6/_static/img/icons/icon-modeling.svg b/branch-3.6/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-monitoring.svg b/branch-3.6/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.6/_static/img/icons/icon-networking.svg b/branch-3.6/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.6/_static/img/icons/icon-news.svg b/branch-3.6/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.6/_static/img/icons/icon-newsletter.svg b/branch-3.6/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.6/_static/img/icons/icon-nsql-guides.svg b/branch-3.6/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.6/_static/img/icons/icon-open-source.svg b/branch-3.6/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.6/_static/img/icons/icon-operator.svg b/branch-3.6/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-overview.svg b/branch-3.6/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.6/_static/img/icons/icon-partners.svg b/branch-3.6/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.6/_static/img/icons/icon-plus.svg b/branch-3.6/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-pricing.svg b/branch-3.6/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.6/_static/img/icons/icon-release-notes.svg b/branch-3.6/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.6/_static/img/icons/icon-resource-center.svg b/branch-3.6/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.6/_static/img/icons/icon-roadmap.svg b/branch-3.6/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.6/_static/img/icons/icon-search.svg b/branch-3.6/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.6/_static/img/icons/icon-slack.svg b/branch-3.6/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-stack-overflow.svg b/branch-3.6/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.6/_static/img/icons/icon-summit.svg b/branch-3.6/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/icons/icon-support.svg b/branch-3.6/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.6/_static/img/icons/icon-tech-talks.svg b/branch-3.6/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.6/_static/img/icons/icon-testing.svg b/branch-3.6/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.6/_static/img/icons/icon-thumbs-down.svg b/branch-3.6/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-thumbs-up.svg b/branch-3.6/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.6/_static/img/icons/icon-tip.svg b/branch-3.6/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.6/_static/img/icons/icon-training.svg b/branch-3.6/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.6/_static/img/icons/icon-triangle-down.svg b/branch-3.6/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.6/_static/img/icons/icon-university.svg b/branch-3.6/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.6/_static/img/icons/icon-users-blog.svg b/branch-3.6/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.6/_static/img/icons/icon-warning.svg b/branch-3.6/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.6/_static/img/icons/icon-webinars.svg b/branch-3.6/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.6/_static/img/icons/icon-whitepapers.svg b/branch-3.6/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.6/_static/img/icons/icon-workshop.svg b/branch-3.6/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.6/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.6/_static/img/logo-docs.svg b/branch-3.6/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.6/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.6/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.6/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.6/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.6/_static/img/mascots/404.jpg b/branch-3.6/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.6/_static/img/mascots/404.jpg differ diff --git a/branch-3.6/_static/img/mascots/scylla-3monsters.png b/branch-3.6/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.6/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-alternator.svg b/branch-3.6/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.6/_static/img/mascots/scylla-cloud.svg b/branch-3.6/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.6/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.6/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-computer-headset.png b/branch-3.6/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-cup-number-one.png b/branch-3.6/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-docs.svg b/branch-3.6/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.6/_static/img/mascots/scylla-drivers.svg b/branch-3.6/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.6/_static/img/mascots/scylla-enterprise.svg b/branch-3.6/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.6/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.6/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-forklift-migration.png b/branch-3.6/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-gear.png b/branch-3.6/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-hardhat.png b/branch-3.6/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-headband.png b/branch-3.6/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-headset.png b/branch-3.6/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-hearts.png b/branch-3.6/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-looking-down.png b/branch-3.6/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-looking-up.png b/branch-3.6/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.6/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.6/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-manager.svg b/branch-3.6/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.6/_static/img/mascots/scylla-monitor.svg b/branch-3.6/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.6/_static/img/mascots/scylla-movement-fast.png b/branch-3.6/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-movement.png b/branch-3.6/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-onpremise.png b/branch-3.6/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-opensource.svg b/branch-3.6/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.6/_static/img/mascots/scylla-operator.svg b/branch-3.6/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.6/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.6/_static/img/mascots/scylla-plugin.png b/branch-3.6/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-release-mascot.png b/branch-3.6/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-repair.png b/branch-3.6/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-server.png b/branch-3.6/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-sleeping.png b/branch-3.6/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-tall-measure.png b/branch-3.6/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-university.png b/branch-3.6/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-weights.png b/branch-3.6/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-window-cleaning.png b/branch-3.6/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-with-computer-2.png b/branch-3.6/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-with-computer.png b/branch-3.6/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-with-linux.png b/branch-3.6/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.6/_static/img/mascots/scylla-writting.png b/branch-3.6/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.6/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.6/_static/img/menu.svg b/branch-3.6/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.6/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.6/_static/img/scylla-monitor.png b/branch-3.6/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.6/_static/img/scylla-monitor.png differ diff --git a/branch-3.6/_static/js/main.bundle.js b/branch-3.6/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-3.6/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
        • Back
        • ',backButtonPosition:"top",wrapper:"
          ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
            "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
            ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
            ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
            ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
            ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
            "],col:[2,"","
            "],tr:[2,"","
            "],td:[3,"","
            "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Monitoring Stack Advisor

            +

            The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them.

            +
            +

            The Advisor section

            +
            +_images/advisor_panel.png +
            +

            The Advisor section

            +
            +
            +

            The Advisor section is located on the Overview dashboard and consists of two parts:

            +

            On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

            +

            For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

            +

            On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

            +

            For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/alerting.html b/branch-3.6/alerting.html new file mode 100644 index 000000000..208e0b612 --- /dev/null +++ b/branch-3.6/alerting.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Alerting

            +

            Alerts are a Prometheus enhancement to notify that something is wrong in the system.

            +

            You can read more about Prometheus alerting here

            +

            By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

            +

            In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

            +

            The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

            +_images/monitoring_stack.png +
            +

            Prometheus Alerts

            +

            The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

            +

            Each alert consists of:

            +
              +
            • Name

            • +
            • What happened

            • +
            • For how long

            • +
            • What to report

            • +
            +

            For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

            +
            - alert: InstanceDown
            +  expr: up == 0
            +  for: 60s
            +  labels:
            +    severity: "2"
            +  annotations:
            +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
            +    summary: Instance {{ $labels.instance }} down
            +
            +
            +

            The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

            +

            The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

            +

            The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

            +

            annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

            +
            +
            +

            Alertmanager

            +

            The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

            +

            The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

            +
              +
            • Routes: Represent a routing tree, the most specific rule, wins

            • +
            • Inhibition: Mute an alert, based on another alert

            • +
            • Receiver: Send a notification via email, sluck, etc’

            • +
            +

            Check the Alertmanager documentation for details on how to specify a specific receiver.

            +

            In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

            +
            +
            +

            Tips When Adding an Alert

            +

            It’s worse having an alert that does not work, than not having an alert at all

            +

            There are multiple ways you can use to make sure your alert is set correctly:

            +
              +
            • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

            • +
            • Force the alert to be active by reducing the limits or the duration.

            • +
            • When possible simulate the actual scenario and see that the alert works as expected.

            • +
            +

            For example, low available disk space.

            +

            Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

            +

            Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

            +

            Starting with a simple working expression helps you bisect problems.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/cql_optimization.html b/branch-3.6/cql_optimization.html new file mode 100644 index 000000000..dad28ff13 --- /dev/null +++ b/branch-3.6/cql_optimization.html @@ -0,0 +1,735 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            The CQL Optimization

            +

            The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

            +
            +_images/cql_optimization_master.png +
            +

            The CQL Dashboard

            +
            +
            +

            The upper part of the dashboard holds CQL related metrics.

            +

            The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

            +
            +

            Note

            +

            Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

            +
            +

            The following sections describe each of the dashboard’s panel

            +
            +

            Prepared Statements

            +

            Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

            +

            Using prepared statements has the following benefits:

            +
              +
            • The database only needs to parse the query once

            • +
            • The driver can route the query to the right node

            • +
            • Using place-holders and values is safer and prevents CQL-Injection

            • +
            +

            The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

            +

            The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

            +
            +
            +

            Token Aware

            +

            Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

            +

            Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

            +

            The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

            +

            The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

            +
            +
            +

            Paged Queries

            +

            By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

            +

            The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

            +

            The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

            +
            +
            +

            Reversed CQL Reads

            +

            Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

            +

            Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

            +

            For example, look at the following table:

            +
            CREATE TABLE ks1.table_demo (
            +   category text,
            +   type int,
            +   PRIMARY KEY (category, type))
            +WITH CLUSTERING ORDER BY (type DESC);
            +
            +
            +

            The following query uses reverse order:

            +
            select * from ks1.table_demo where category='cat1' order by type ASC;
            +
            +
            +

            The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

            +

            The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

            +
            +
            +

            ALLOW FILTERING

            +

            Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

            +

            These kinds of queries can create a big load on the system, and should be used with care.

            +

            The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

            +

            The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

            +

            The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

            +

            The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

            +

            The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

            +
            +
            +

            Consistency Level

            +

            Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

            +

            The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

            +

            Two consistency levels hold a potential problem and should be used with care ANY and ALL.

            +

            The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

            +

            The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

            +

            The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

            +

            The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

            +
            +
            +

            Cross DC

            +

            Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

            +
            +
            +

            Cross DC Consistency Level

            +

            Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

            +
            +
            +

            Cross DC read requests

            +
            +

            Note

            +

            The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

            +
            +

            In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

            +

            The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/docker_compose.html b/branch-3.6/docker_compose.html new file mode 100644 index 000000000..2cf3b0917 --- /dev/null +++ b/branch-3.6/docker_compose.html @@ -0,0 +1,751 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Using Docker Compose

            +

            Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

            +

            Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

            +
            +

            Warning

            +

            docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

            +
            +
            +

            Prerequisite

            +

            Make sure you have docker and docker-compose installed.

            +
            +
            +

            Setting Prometheus

            +

            The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

            +

            You can use ./prometheus-config.sh to generate the file, for example:

            +
            ./prometheus-config.sh --compose
            +
            +
            +

            For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

            +
            +
            +

            Setting Grafana Provisioning

            +

            Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

            +
            +

            Grafana Data-Source file

            +

            Run the following command to update the datasource:

            +
            ./grafana-datasource.sh --compose
            +
            +
            +

            You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

            +
            +
            +

            Grafana Dashboard Load file

            +

            To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

            +
            ./generate-dashboards.sh -t -v 2020.1
            +
            +
            +

            This command generates the files under: grafana/provisioning/dashboards/

            +
            +
            +
            +

            Docker Compose file

            +

            You can use the following example as a base for your docker compose.

            +

            Pass the following to a file called docker-compose.yml

            +
            services:
            +  alertmanager:
            +    container_name: aalert
            +    image: prom/alertmanager:v0.21.0
            +    ports:
            +    - 9093:9093
            +    volumes:
            +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
            +  grafana:
            +    container_name: agraf
            +    environment:
            +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
            +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
            +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
            +    # This is where you set Grafana security
            +    - GF_AUTH_BASIC_ENABLED=false
            +    - GF_AUTH_ANONYMOUS_ENABLED=true
            +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
            +    - GF_SECURITY_ADMIN_PASSWORD=admin
            +    image: grafana/grafana:7.3.5
            +    ports:
            +    - 3000:3000
            +    user: 1000:1000
            +    volumes:
            +    - ./grafana/build:/var/lib/grafana/dashboards
            +    - ./grafana/plugins:/var/lib/grafana/plugins
            +    - ./grafana/provisioning:/var/lib/grafana/provisioning
            +    # Uncomment the following line for grafana persistency
            +    # - path/to/grafana/dir:/var/lib/grafana
            +  loki:
            +    command:
            +    - --config.file=/mnt/config/loki-config.yaml
            +    container_name: loki
            +    image: grafana/loki:2.0.0
            +    ports:
            +    - 3100:3100
            +    volumes:
            +    - ./loki/rules:/etc/loki/rules
            +    - ./loki/conf:/mnt/config
            +  promotheus:
            +    command:
            +    - --config.file=/etc/prometheus/prometheus.compose.yml
            +    container_name: aprom
            +    image: prom/prometheus:v2.18.1
            +    ports:
            +    - 9090:9090
            +    volumes:
            +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
            +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
            +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
            +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
            +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
            +    # Uncomment the following line for prometheus persistency 
            +    # - path/to/data/dir:/prometheus/data
            +  promtail:
            +    command:
            +    - --config.file=/etc/promtail/config.yml
            +    container_name: promtail
            +    image: grafana/promtail:2.0.0
            +    ports:
            +    - 1514:1514
            +    - 9080:9080
            +    volumes:
            +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
            +version: '3'
            +
            +
            +
            +

            Start and Stop

            +

            To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/genindex.html b/branch-3.6/genindex.html new file mode 100644 index 000000000..f100ca62d --- /dev/null +++ b/branch-3.6/genindex.html @@ -0,0 +1,587 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + + + + + +
            + + + + + +
            + + +
            + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/index.html b/branch-3.6/index.html new file mode 100644 index 000000000..81711c4c6 --- /dev/null +++ b/branch-3.6/index.html @@ -0,0 +1,624 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Monitoring Stack

            +
            +
            +

            Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

            +

            For older versions of Scylla Monitoring Stack see here.

            +_images/monitor.png +

            The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

            +
              +
            • prometheus - collects and stores metrics

            • +
            • alertmanager - handles alerts

            • +
            • grafana - dashboard server

            • +
            +

            Choose a topic to get started:

            + +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/matrix.html b/branch-3.6/matrix.html new file mode 100644 index 000000000..ae60ef2d6 --- /dev/null +++ b/branch-3.6/matrix.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Monitoring Stack Support Matrix

            +

            The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

            + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

            Scylla Monitoring Stack Version

            Scylla Open Source Version

            Scylla Enterprise Version

            Node_exporter[1] Version

            Scylla Manager Version

            3.6.3

            4.1, 4.2, 4.3

            2019.1, 2020.1

            0.17

            2.1, 2.2, 2.3

            3.6.1

            4.1, 4.2, 4.3

            2019.1, 2020.1

            0.17

            2.1, 2.2

            3.6.0

            4.1, 4.2, 4.3, 4.4

            2019.1, 2020.1

            0.17

            2.1, 2.2

            3.5

            3.3, 4.0, 4.1, 4.2

            2019.1, 2020.1

            0.17

            2.0, 2.1, 2.2

            3.4.3

            3.3, 4.0, 4.1, 4.2

            2019.1, 2020.1

            0.17

            2.0, 2.1

            3.4

            3.3, 4.0, 4.1

            2018.1, 2019.1

            0.17

            2.0, 2.1

            3.3

            3.1, 3.2, 3.3, 4.0

            2018.1, 2019.1

            0.17

            1.4, 2.0, 2.1

            3.2

            3.1, 3.2, 3.3

            2018.1, 2019.1

            0.17

            1.4, 2.0

            3.1

            2.3, 3.0, 3.1, 3.2

            2018.1, 2019.1

            0.17

            1.3, 1.4, 2.0

            3.0

            2.3, 3.0, 3.1, 3.2

            2018.1, 2019.1

            0.17

            1.3, 1.4

            2.4

            2.3, 3.0, 3.1

            2018.1, 2019.1

            0.14, 0.17

            1.3, 1.4

            2.3

            2.3, 3.0

            2018.1, 2019.1

            0.14, 0.17

            1.3

            2.2

            2.3, 3.0

            2018.1, 2019.1

            0.14, 0.17

            1.3

            2.1

            2.3, 3.0

            2018.1

            0.14, 0.17

            1.3

            +

            [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/min-prod-hw.html b/branch-3.6/min-prod-hw.html new file mode 100644 index 000000000..8438f9531 --- /dev/null +++ b/branch-3.6/min-prod-hw.html @@ -0,0 +1,616 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Minimal Production System Recommendations

            +
              +
            • CPU - at least 2 physical cores/ 4vCPUs

            • +
            • Memory - 15GB+ DRAM

            • +
            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

            • +
            • Network - 1GbE/10GbE preferred

            • +
            +
            +

            Calculating Prometheus Minimal Disk Space requirement

            +

            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

            +

            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

            +

            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

            +
            6 * 16 * 200MB ~ 20GB
            +
            +
            +

            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

            +
            +
            + + +
            + + + + + +
            + + +
            + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/monitor_troubleshoot.html b/branch-3.6/monitor_troubleshoot.html new file mode 100644 index 000000000..d6151cb2e --- /dev/null +++ b/branch-3.6/monitor_troubleshoot.html @@ -0,0 +1,814 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Troubleshoot Scylla Monitoring Stack

            +

            This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

            +
            +

            Problem

            + +
            +

            Scylla-Manager 2.2 with Duplicate information

            +

            Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

            +
              +
            • For Manager server: from 56090 to 5090

            • +
            • For Manager Agent: from 56090 to 5090

            • +
            +

            For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

            +

            However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

            +

            The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

            +

            Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

            +
            +
            +

            A Container Fails To Start

            +

            When running ./start-all.sh a container can fail to start. For example you can see the following error message:

            +
            Wait for Prometheus container to start........Error: Prometheus container failed to start
            +
            +
            +

            Should this happen, check the Docker logs for more information.

            +
            docker logs aprom
            +
            +
            +

            Usually the reason for the failure is described in the logs.

            +
            +
            +

            Files And Directory Permissions

            +
            +

            Note

            +

            Avoid running Docker containers as root.

            +
            +

            The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

            +

            If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

            +
            +

            Note

            +

            If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

            +
            +

            For example if your Prometheus data directory is /prom-data and you are using centos user

            +
            ls -la /|grep prom-data
            +
            +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
            +
            +sudo chown -R centos:centos /prom-data
            +
            +ls -la /|grep prom-data
            +
            +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
            +
            +
            +
            +
            +

            No Data Points

            +

            No data points on all data charts.

            +
            +

            Solution

            +

            If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

            +
              +
            1. Login to the Prometheus console:

            2. +
            3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

            4. +
            5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

            6. +
            +
            +
              +
            • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

            • +
            • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

            • +
            • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

            • +
            +
            +

            For example:

            +
            ./start-all.sh -v 3.1
            +
            +
            +

            More on start-all.sh options.

            +
            +
            +
            +

            Grafana Chart Shows Error (!) Sign

            +

            Run this procedure on the Scylla Monitoring Stack server.

            +

            If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

            +
            +

            Solution

            +

            On the Scylla Monitoring Stack server:

            +
              +
            1. Check Prometheus is running using docker ps.

            2. +
            +
              +
            • If it is not running check the prometheus.yml for errors.

            • +
            +

            For example:

            +
            CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
            +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
            +
            +
            +
              +
            • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

            • +
            +
            +
            +
            +

            Grafana Shows Server Level Metrics, but not Scylla Metrics

            +

            Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

            +
            +

            Solution

            +
              +
            • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

            • +
            +

            For example

            +
            curl 172.17.0.2:9180/metrics
            +
            +
            +
            +
            +
            +

            Grafana Shows Scylla Metrics, but not Server Level Metrics

            +

            Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

            +
            +

            Solution

            +

            1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

            +
              +
            1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

            2. +
            +
            +
            +

            Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

            +

            While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

            +

            If the node_exporter service is not starting it may need to be updated manually.

            +

            Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

            +
            +
            +
            +

            Working with Wireshark

            +

            No metrics shown in the Scylla Monitoring Stack.

            +
              +
            1. Install wireshark

            2. +
            +

            2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

            +

            For example:

            +
            tshark -i eth0 -f "dst port 9180"
            +
            +
            +

            Capture from Scylla node towards Scylla Monitoring Stack server.

            +

            In this example, Scylla is running.

            +
            Monitor ip        Scylla node ip
            +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
            +
            +
            +

            In this example, Scylla is not running

            +
            Monitor ip        Scylla node ip
            +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
            +
            +
            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/monitor_without_docker.html b/branch-3.6/monitor_without_docker.html new file mode 100644 index 000000000..4c21f636c --- /dev/null +++ b/branch-3.6/monitor_without_docker.html @@ -0,0 +1,942 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Deploying Scylla Monitoring Stack Without Docker

            +

            The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

            +

            Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

            +
            +

            Minimal Production System Recommendations

            +
              +
            • CPU - at least 2 physical cores/ 4vCPUs

            • +
            • Memory - 15GB+ DRAM

            • +
            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

            • +
            • Network - 1GbE/10GbE preferred

            • +
            +
            +

            Calculating Prometheus Minimal Disk Space requirement

            +

            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

            +

            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

            +

            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

            +
            6 * 16 * 200MB ~ 20GB
            +
            +
            +

            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

            +

            The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. The current monitoring solution does not churn data.

            +
            +
            +
            +

            Install Scylla Monitoring Stack

            +

            The following procedure uses a CentOS 7 based instance

            +
              +
            1. Download the latest Scylla Monitoring Stack release.

            2. +
            +

            wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz

            +
              +
            1. Open the tar

            2. +
            +

            tar -xvf scylla-monitoring-3.5.tar.gz

            +
            +
            +

            Install Alertmanager

            +

            Tested with alertmanager 0.20.0 version

            +
              +
            1. Install alertmanager

            2. +
            +
            wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz
            +tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz
            +
            +
            +
              +
            1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to alertmanager.yml in the alertmanager installation directory.

            2. +
            +

            For example:

            +
            cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml
            +
            +
            +
              +
            1. Start the Alertmanager

            2. +
            +

            For example:

            +
            cd alertmanager-0.20.0.linux-amd64
            +./alertmanager
            +
            +
            +
              +
            1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

            2. +
            +

            For example:

            +
            http://192.168.135.166:9093/
            +
            +
            +_images/alertmanager.png +
            +
            +

            Install Prometheus

            +

            Tested with Prometheus version 2.18.1

            +
              +
            1. Install Prometheus

            2. +
            +
            wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz
            +tar -xvf prometheus-2.18.1.linux-amd64.tar.gz
            +
            +
            +
              +
            1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to Prometheus installation directory.

            2. +
            +

            Copy prometheus/prometheus.yml.template to prometheus.yml

            +

            For example:

            +
            cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64
            +cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml
            +
            +
            +
              +
            1. Edit the prometheus.yml file to point to the correct static data sources.

            2. +
            +
            +

            Note

            +

            Make sure to include the honor_labels: false parameter in the prometheus.yml file.

            +
            +
            vi prometheus-2.18.1.linux-amd64/prometheus.yml
            +
            +
            +

            Set the alertmanger address and port by replacing AM_ADDRESS in the file.

            +

            For example if the alertmanager will run on the same host:

            +
            alerting:
            +   alertmanagers:
            +   - static_configs:
            +       - targets:
            +           - 127.0.0.1:9093
            +
            +
            +

            Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

            +

            For example the scrape config for Scylla:

            +
            global:
            +  scrape_interval: 5s # By default, scrape targets every 5 second.
            +  scrape_timeout: 4s # Timeout before trying to scape a target again
            +
            +  # Attach these labels to any time series or alerts when communicating with
            +  # external systems (federation, remote storage, Alertmanager).
            +  external_labels:
            +    monitor: 'scylla-monitor'
            +
            +scrape_configs:
            +- job_name: scylla
            +  honor_labels: false
            +  file_sd_configs:
            +    - files:
            +      - scylla_servers.yml
            +  relabel_configs:
            +    - source_labels: [__address__]
            +      regex:  '([^:]+)'
            +      target_label: __address__
            +      replacement: '${1}:9180'
            +
            +    - source_labels: [__address__]
            +      regex:  '(.*):.+'
            +      target_label: instance
            +      replacement: '${1}'
            +
            +
            +
              +
            1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

            2. +
            +
            +

            Note

            +

            There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

            +
            +

            An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

            +
            +

            Note

            +

            You must have both files even if you are not using Scylla Manager

            +
            +

            Add the labels for the cluster and data-center

            +

            scylla_servers.yml:

            +

            For example:

            +
            cat scylla_servers.yml
            +# List Scylla end points
            +
            +- targets:
            +  - 192.168.66.6
            +  - 192.168.66.244
            +  labels:
            +    cluster: cluster1
            +    dc: dc1
            +- targets:
            +    - 172.17.0.3
            +  labels:
            +    cluster: cluster1
            +    dc: dc2
            +
            +
            +
            +

            Note

            +

            See the previous note about deprecating the node_exporter_servers.yml file.

            +
            +

            scylla_manager_server.yml

            +

            For example:

            +
            - targets:
            +  - 127.0.0.1:56090
            +
            +
            +
              +
            1. Create a data directory for Prometheus to store the metrics data

            2. +
            +

            For example:

            +
            mkdir prometheus-2.18.1.linux-amd64/mydata
            +
            +
            +
              +
            1. Start Prometheus server:

            2. +
            +

            For example:

            +
            cd prometheus-2.18.1.linux-amd64
            +./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata
            +
            +
            +

            Data should start accumulate on: ./mydata

            +
              +
            1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

            2. +
            +

            For example:

            +
            http://192.168.135.166:9090/
            +
            +
            +_images/1.png +

            Prometheus console should be visible

            +
              +
            1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

            2. +
            +

            For example:

            +

            node_memory_MemFree

            +_images/2.png +

            And

            +

            scylla_reactor_utilization

            +_images/3.png +

            At this point Scylla is emitting the metrics and Prometheus is able to store them.

            +
            +
            +

            Install Grafana

            +

            Tested with Grafna 6.7.3

            +
              +
            1. Install Grafana based on the instructions here make sure to use version 6.7.0 or higher

            2. +
            +

            Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

            +
              +
            1. Access Scylla-Grafana-monitoring directory

            2. +
            +

            cd scylla-monitoring-scylla-monitoring-3.5/

            +
              +
            1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

            2. +
            +
            sudo cp -r grafana/plugins /var/lib/grafana/
            +
            +
            +

            If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

            +

            For example:

            +
            cp -r grafana/plugins ../grafana-6.7.3/public/app
            +
            +
            +
              +
            1. Provision the Dashboard them

            2. +
            +

            For example Scylla version 4.0 and Scylla manager version 2.0

            +

            For Grafana installed with yum install

            +
            sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
            +sudo mkdir -p /var/lib/grafana/dashboards
            +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
            +
            +
            +

            For Grafana installed from packages

            +
            cp -p -r grafana/build/* ../grafana-6.7.3/public/build/
            +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml
            +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml
            +
            +
            +

            Edit the load.* files in /home/centos/grafana-6.7.3/conf/provisioning/dashboards/ for the correct path, +for example load.4.0.yaml would point to: /home/centos/grafana-6.7.3/public/build/ver_4.0 and the FOLDER will be 4.0

            +
              +
            1. Set the data source by copy datasource.yml and edit it

            2. +
            +
            sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
            +
            +
            +

            For Grafana installed from packages

            +
            cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/
            +
            +
            +

            You should set the Prometheus and the alertmanager IP and port.

            +

            For example

            +
            sudo cat /etc/grafana/provisioning/datasources/datasource.yml
            +apiVersion: 1
            +datasources:
            + - name: prometheus
            +   type: prometheus
            +   url: http://192.168.135.167:9090
            +   access: proxy
            +   basicAuth: false
            +
            + - name: alertmanager
            +   type: camptocamp-prometheus-alertmanager-datasource
            +   orgId: 1
            +   typeLogoUrl: public/img/icn-datasource.svg
            +   access: proxy
            +   url: http://192.168.135.166:9093
            +   password:
            +   user:
            +   database:
            +   basicAuth:
            +   isDefault:
            +   jsonData:
            +     severity_critical: '4'
            +     severity_high: '3'
            +     severity_warning: '2'
            +     severity_info: '1'
            +
            +
            +
              +
            1. Start the Grafana service

            2. +
            +

            For Grafana installed with yum install

            +

            sudo service grafana-server start

            +

            For Grafana installed from packages:

            +

            cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini

            +

            Edit scylla.ini to reflect the right paths in the paths section of the file.

            +
            plugins = /home/centos/grafana-6.7.3/data/plugins
            +provisioning = /home/centos/grafana-6.7.3/conf/provisioning
            +
            +
            +

            Start the server:

            +
            cd /home/centos/grafana-6.7.3/
            +./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini
            +
            +
            +
              +
            1. Make sure Grafana is running

            2. +
            +

            Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

            +_images/grafana.png +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/monitoring_apis.html b/branch-3.6/monitoring_apis.html new file mode 100644 index 000000000..1bac69c78 --- /dev/null +++ b/branch-3.6/monitoring_apis.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Scylla Monitoring Stack Interfaces

            +

            Scylla exposes two interfaces for online monitoring, as described below

            +
            +

            Prometheus

            +

            By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

            +

            For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

            +

            You can change the Prometheus listening address and port in scylla.yaml file

            +
            # prometheus port
            +# By default, Scylla opens prometheus API port on port 9180
            +# setting the port to 0 will disable the prometheus API.
            +prometheus_port: 9180
            +#
            +# prometheus address
            +# By default, Scylla binds all interfaces to the prometheus API
            +# It is possible to restrict the listening address to a specific one
            +prometheus_address: 0.0.0.0
            +
            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/monitoring_stack.html b/branch-3.6/monitoring_stack.html new file mode 100644 index 000000000..7f56cf30a --- /dev/null +++ b/branch-3.6/monitoring_stack.html @@ -0,0 +1,942 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Install Scylla Monitoring Stack

            + +

            This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

            +

            The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

            +

            For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

            +
            +

            Minimal Production System Recommendations

            +
              +
            • CPU - at least 2 physical cores/ 4vCPUs

            • +
            • Memory - 15GB+ DRAM

            • +
            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

            • +
            • Network - 1GbE/10GbE preferred

            • +
            +
            +

            Calculating Prometheus Minimal Disk Space requirement

            +

            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

            +

            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

            +

            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

            +
            6 * 16 * 200MB ~ 20GB
            +
            +
            +

            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

            +
            +
            +
            +

            Prerequisites

            + +
            +
            +

            Docker Post Installation

            +

            Docker post installation guide can be found here

            +
            +

            Note

            +

            Avoid running the container as root.

            +
            +

            To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

            +
              +
            1. Create the Docker group.

            2. +
            +
            sudo groupadd docker
            +
            +
            +
              +
            1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

            2. +
            +
            sudo usermod -aG docker $USER
            +
            +
            +
              +
            1. Start Docker by calling:

            2. +
            +
            sudo systemctl enable docker
            +
            +
            +
            +
            +

            Install Scylla Monitoring Stack

            +

            Procedure

            +
              +
            1. Download and extract the latest Scylla Monitoring Stack binary;.

            2. +
            +
            wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.6.3.tar.gz
            +tar -xvf scylla-monitoring-3.6.3.tar.gz
            +cd scylla-monitoring-scylla-monitoring-3.6.3
            +
            +
            +

            As an alternative, you can clone and use the Git repository directly.

            +
            git clone https://github.com/scylladb/scylla-monitoring.git
            +cd scylla-monitoring
            +git checkout branch-3.6
            +
            +
            +
              +
            1. Start Docker service if needed

            2. +
            +
            sudo systemctl restart docker
            +
            +
            +
            +
            +

            Configure Scylla Monitoring Stack

            +

            To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

            +

            This configuration can be done from files, or using the Consul api.

            +

            Scylla Manager 2.0 and higher supports the Consul API.

            +
            +

            Configure Scylla nodes from files

            +
              +
            1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

            2. +
            +
            +

            Note

            +

            It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

            +
            +

            For example:

            +
            - targets:
            +      - 172.17.0.2
            +      - 172.17.0.3
            +  labels:
            +      cluster: cluster1
            +      dc: dc1
            +
            +
            +
            +

            Note

            +

            If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

            +
            +

            Using IPV6

            +

            To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

            +

            For example:

            +
            - targets:
            +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
            +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
            +  labels:
            +      cluster: cluster1
            +      dc: dc1
            +
            +
            +
            +

            Note

            +

            For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

            +
            +

            For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

            +
            +

            Note

            +

            By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

            +
            +

            If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

            +

            For example:

            +
            ./start-all.sh -s my_scylla_server.yml -d prometheus_data
            +
            +
            +

            Mark the different Data Centers with Labels.

            +

            As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

            +

            You can use the genconfig.py script to generate the server file. For example:

            +
            ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
            +
            +
            +

            This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

            +

            OR

            +

            The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

            +
            nodetool status | ./genconfig.py -NS
            +
            +
            +

            2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

            +

            You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

            +

            For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

            +
            # List Scylla Manager end points
            +
            +- targets:
            +  - 172.17.0.7:5090
            +
            +
            +

            Note that you do not need to add labels to the Scylla Manager targets.

            +
            +
            +

            Configure Scylla nodes using Scylla-Manager Consul API

            +

            Scylla Manager 2.0 has a Consul like API.

            +

            When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

            +

            For example:

            +
            ./start-all.sh -L 10.10.0.1
            +
            +
            +
            +

            Note

            +

            If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

            +
            +
            +
            +

            Connecting Scylla-Monitoring to Scylla

            +

            Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

            +

            You can limit the user to read only, currently it only read table from the system keyspace.

            +

            To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

            +

            Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

            +
            +
            +

            Use an external directory for the Prometheus data directory

            +

            The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

            +
            +

            Note

            +

            Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

            +
            +

            If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

            +

            In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

            +
            +
            +

            Add Additional Prometheus Targets

            +

            There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

            +

            The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

            +

            You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

            +
            - job_name: 'myservice'
            +  # Override the global default and scrape targets from this job every 5 seconds.
            +  scrape_interval: 5s
            +  static_configs:
            +    - targets:
            +      - 17.0.0.1:7000
            +
            +
            +
            +
            +
            +

            Start and Stop Scylla Monitoring Stack

            +
            +

            Start

            +
            ./start-all.sh -d prometheus_data
            +
            +
            +
            +
            +

            Stop

            +
            ./kill-all.sh
            +
            +
            +
            +
            +

            Start a Specific Scylla Monitoring Stack Version

            +

            By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

            +

            You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

            +

            Multiple versions are supported. For example:

            +
            ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
            +
            +
            +

            will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

            +
            +
            +

            Accessing the localhost

            +

            The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

            +
            ./start-all.sh -l -d prometheus-data
            +
            +
            +
            +
            +

            Configure rsyslog on each Scylla node

            +

            generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

            +

            Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

            +

            Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

            +

            If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

            +
            if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
            +
            +
            +

            Restart rsyslog for the configuration to take effect.

            +
            systemctl restart rsyslog
            +
            +
            +
            +
            +
            +

            View Grafana Dashboards

            +

            Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/objects.inv b/branch-3.6/objects.inv new file mode 100644 index 000000000..355524c7b Binary files /dev/null and b/branch-3.6/objects.inv differ diff --git a/branch-3.6/robots.txt b/branch-3.6/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.6/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.6/search.html b/branch-3.6/search.html new file mode 100644 index 000000000..05884bebb --- /dev/null +++ b/branch-3.6/search.html @@ -0,0 +1,590 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + + + + + +
            + + + + + +
            + + +
            + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/searchindex.js b/branch-3.6/searchindex.js new file mode 100644 index 000000000..f2227b300 --- /dev/null +++ b/branch-3.6/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "advisor", "alerting", "cql_optimization", "docker_compose", "index", "matrix", "min-prod-hw", "monitor_troubleshoot", "monitor_without_docker", "monitoring_apis", "monitoring_stack", "start_all", "thanos", "updating_dashboard"], "filenames": ["_common/monitor-description.rst", "advisor.rst", "alerting.rst", "cql_optimization.rst", "docker_compose.rst", "index.rst", "matrix.rst", "min-prod-hw.rst", "monitor_troubleshoot.rst", "monitor_without_docker.rst", "monitoring_apis.rst", "monitoring_stack.rst", "start_all.rst", "thanos.rst", "updating_dashboard.rst"], "titles": ["<no title>", "Scylla Monitoring Stack Advisor", "Alerting", "The CQL Optimization", "Using Docker Compose", "Scylla Monitoring Stack", "Scylla Monitoring Stack Support Matrix", "Minimal Production System Recommendations", "Troubleshoot Scylla Monitoring Stack", "Deploying Scylla Monitoring Stack Without Docker", "Scylla Monitoring Stack Interfaces", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Adding and Modifying Dashboards"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14], "6": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "scylla": [0, 2, 3, 4, 7, 12, 14], "monitor": [0, 2, 3, 4, 7, 12, 14], "stack": [0, 3, 4, 12, 14], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], "full": [0, 2, 5, 11], "alert": [0, 5, 9, 11], "The": [0, 2, 4, 5, 6, 7, 8, 9, 11, 13], "contain": [0, 3, 4, 5, 11, 12, 13, 14], "open": [0, 5, 6, 9, 10, 11], "sourc": [0, 2, 5, 6, 9, 11], "tool": [0, 3, 5, 8], "includ": [0, 5, 9], "prometheu": [0, 3, 5, 6, 8, 14], "grafana": [0, 2, 5, 13], "well": [0, 5, 11], "custom": [0, 5], "dashboard": [0, 1, 2, 3, 5, 6, 8, 9, 12], "an": [1, 3, 4, 7, 8, 9, 12, 13, 14], "element": [1, 14], "recogn": 1, "bad": 1, "practic": 1, "configur": [1, 2, 4, 8, 9, 10, 12, 14], "potenti": [1, 3], "problem": [1, 2, 3], "advis": [1, 4], "how": [1, 2, 3, 12, 13, 14], "solv": 1, "them": [1, 2, 9, 12, 14], "locat": [1, 2, 4, 12], "overview": [1, 2], "consist": [1, 2, 5], "two": [1, 3, 4, 10, 11, 12, 13], "part": [1, 2, 3, 11], "On": [1, 8], "left": 1, "issu": [1, 3, 14], "tabl": [1, 2, 3, 6, 11], "each": [1, 2, 3, 6, 7, 8, 9, 12, 13, 14], "ha": [1, 2, 3, 7, 8, 9, 11, 12, 14], "categori": [1, 3], "link": [1, 14], "jump": 1, "relev": [1, 12], "descript": [1, 2], "For": [1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12, 14], "exampl": [1, 2, 3, 4, 7, 8, 9, 11, 12, 13], "could": [1, 3, 13], "warn": 1, "about": [1, 2, 9, 14], "us": [1, 2, 3, 5, 7, 8, 9, 12], "larg": [1, 14], "cell": 1, "data": [1, 2, 3, 9, 12, 14], "usual": [1, 3, 8, 14], "indic": [1, 3], "model": [1, 3], "client": [1, 3], "code": 1, "can": [1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14], "impact": 1, "system": [1, 2, 3, 4, 12], "perform": [1, 3, 7, 9, 11], "right": [1, 3, 9, 11, 14], "balanc": [1, 3], "thi": [1, 2, 3, 4, 7, 8, 9, 11, 12, 13, 14], "notifi": [1, 2], "you": [1, 2, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14], "imbal": 1, "between": [1, 3, 8, 13], "shard": 1, "node": [1, 3, 6, 7, 8, 9, 12], "imbalanc": 1, "mai": [1, 3, 8], "when": [1, 3, 4, 7, 8, 9, 11, 12, 13, 14], "singl": [1, 13, 14], "hot": 1, "partit": 1, "get": [1, 2, 3, 5, 11, 13, 14], "most": [1, 2, 3, 9, 14], "request": [1, 10, 12], "make": [1, 2, 3, 4, 8, 9, 11, 12, 13, 14], "one": [1, 3, 4, 10, 11, 12], "bottleneck": 1, "latenc": [1, 3], "cach": 1, "hit": 1, "ar": [1, 2, 3, 4, 8, 9, 11, 12, 13, 14], "enhanc": 2, "someth": [2, 12, 14], "wrong": [2, 3, 8, 14], "read": [2, 4, 8, 11, 13], "more": [2, 3, 4, 8, 10, 11, 14], "here": [2, 5, 9, 11, 12, 14], "By": [2, 3, 9, 10, 11, 12, 14], "default": [2, 3, 7, 8, 9, 10, 11, 12, 14], "shown": [2, 8], "also": [2, 11, 12, 13, 14], "sent": 2, "other": [2, 4, 13], "extern": [2, 3, 4, 8, 9, 12, 13, 14], "like": [2, 3, 7, 8, 9, 11, 13, 14], "email": 2, "slack": 2, "In": [2, 3, 4, 8, 11, 14], "gener": [2, 3, 4, 11], "specif": [2, 3, 8, 10, 12], "condit": 2, "met": 2, "within": [2, 11], "certain": 2, "period": [2, 7, 9, 11, 13], "time": [2, 3, 7, 9, 11, 12, 13], "thei": [2, 12], "send": [2, 3, 11], "act": [2, 11, 13], "so": [2, 3, 8, 11, 12, 13, 14], "activ": [2, 11], "defin": [2, 3, 14], "rule": [2, 4, 9, 12], "yml": [2, 3, 4, 8, 9, 11, 12, 13], "file": [2, 9, 10, 12, 13, 14], "directori": [2, 4, 9, 12, 13, 14], "name": [2, 3, 8, 9, 11, 13], "what": 2, "happen": [2, 8], "long": [2, 13], "report": [2, 3, 6, 8], "let": 2, "u": 2, "look": [2, 3, 11, 13, 14], "instancedown": 2, "come": [2, 12], "expr": [2, 14], "up": [2, 3, 4, 8, 9], "0": [2, 4, 6, 9, 10, 11, 12, 13, 14], "60": 2, "label": [2, 9, 11, 13], "sever": 2, "2": [2, 4, 6, 7, 9, 11, 12, 14], "annot": 2, "instanc": [2, 9, 11, 14], "been": 2, "down": [2, 4, 8], "than": [2, 3, 11, 14], "30": [2, 12], "second": [2, 8, 9, 11], "summari": 2, "legal": 2, "express": 2, "case": [2, 3, 7, 8, 9, 11, 12, 13, 14], "metric": [2, 3, 5, 6, 7, 9, 11, 12, 13, 14], "equal": 2, "set": [2, 9, 10, 11, 12, 14], "minim": 2, "durat": 2, "befor": [2, 3, 9, 11], "prior": 2, "pend": 2, "mode": [2, 14], "hold": [2, 3, 7, 9, 11], "addit": [2, 3, 12], "special": 2, "add": [2, 3, 9, 10, 12, 13, 14], "notif": 2, "forward": 2, "from": [2, 3, 4, 8, 9, 12, 13], "server": [2, 3, 4, 5, 9, 10, 11, 12, 13, 14], "respons": 2, "duplic": [2, 3], "group": [2, 11], "rout": [2, 3], "found": [2, 9, 11, 12, 14], "rule_config": [2, 4, 9, 12], "three": [2, 5, 11], "repres": 2, "tree": 2, "win": [2, 8], "inhibit": 2, "mute": 2, "base": [2, 3, 4, 9, 11, 12, 13, 14], "anoth": [2, 12], "receiv": [2, 3], "via": [2, 8], "sluck": 2, "etc": [2, 4, 9, 11, 12, 14], "check": [2, 3, 8], "document": [2, 8, 11, 13, 14], "detail": 2, "specifi": [2, 4, 8, 11, 12, 14], "It": [2, 4, 10, 11, 12, 14], "": [2, 3, 11, 12, 14], "wors": 2, "have": [2, 4, 7, 8, 9, 11, 12, 13, 14], "doe": [2, 3, 7, 8, 9, 11, 12, 13, 14], "work": [2, 11, 12, 13, 14], "all": [2, 3, 4, 5, 8, 10, 11, 13, 14], "There": [2, 9, 11, 13, 14], "multipl": [2, 3, 11, 12, 13, 14], "wai": [2, 3, 4, 8, 12], "sure": [2, 3, 4, 8, 9, 11, 13, 14], "your": [2, 3, 4, 8, 9, 10, 11, 12, 13, 14], "correctli": [2, 14], "start": [2, 5, 9, 13, 14], "path": [2, 4, 9, 11, 12, 13], "mail": 2, "simpl": 2, "negat": 2, "logic": 2, "forc": 2, "reduc": [2, 14], "limit": [2, 3, 11, 13], "possibl": [2, 3, 10, 12], "simul": 2, "actual": 2, "scenario": 2, "see": [2, 3, 4, 5, 7, 8, 9, 10, 11, 14], "expect": 2, "low": [2, 3], "avail": [2, 3, 9, 11, 13, 14], "disk": [2, 8, 12, 14], "space": 2, "assum": [2, 7, 9, 11, 12, 13], "want": [2, 11], "lower": [2, 3], "10": [2, 11, 14], "fire": 2, "That": [2, 12, 14], "would": [2, 3, 9, 11, 13, 14], "show": [2, 3, 6, 14], "propag": 2, "ani": [2, 3, 8, 9, 11, 14], "valu": [2, 3, 14], "similar": [2, 14], "current": [2, 8, 9, 11, 12, 14], "situat": [2, 3, 11, 12], "now": [2, 13], "free": 2, "below": [2, 4, 10, 11], "creat": [2, 3, 4, 8, 9, 11, 12, 14], "some": [2, 13], "big": [2, 3], "help": [2, 3, 9, 12, 14], "bisect": 2, "identifi": 3, "driver": 3, "upper": 3, "relat": 3, "gaug": 3, "graph": [3, 14], "inspect": 3, "we": [3, 7, 9, 11, 13, 14], "zero": 3, "besid": [3, 12], "intern": [3, 14], "which": [3, 4, 6, 13, 14], "mislead": 3, "test": [3, 8, 9], "traffic": [3, 8, 13], "follow": [3, 4, 6, 7, 8, 9, 11, 12, 14], "section": [3, 7, 8, 9, 11], "describ": [3, 8, 10, 11, 13], "panel": 3, "first": 3, "templat": [3, 8, 9, 11, 13], "place": [3, 11, 12, 13, 14], "holder": 3, "differ": [3, 4, 9, 11, 12, 13, 14], "benefit": [3, 13], "databas": [3, 4, 9, 12], "onli": [3, 11, 12], "need": [3, 7, 8, 9, 11, 12, 13, 14], "pars": [3, 14], "onc": [3, 4], "safer": 3, "prevent": 3, "inject": 3, "non": [3, 8], "percentag": [3, 14], "rate": 3, "both": [3, 4, 8, 9, 11], "distribut": 3, "where": [3, 4, 8, 9, 11, 14], "rang": [3, 8], "ring": 3, "ideal": 3, "reach": [3, 11, 13], "replica": [3, 13], "fail": 3, "do": [3, 8, 11, 12, 14], "mean": [3, 12, 14], "coordin": 3, "result": [3, 11, 12], "higher": [3, 9, 11], "increas": 3, "resourc": 3, "usag": [3, 8], "typic": [3, 9, 14], "know": [3, 8, 11], "replic": 3, "load": [3, 8, 9, 11], "caus": 3, "did": 3, "break": [3, 14], "chunk": 3, "repli": 3, "size": [3, 14], "requir": [3, 4, 13], "return": [3, 8], "overal": 3, "should": [3, 4, 8, 9, 11, 13, 14], "avoid": [3, 8, 11, 14], "support": [3, 5, 11, 14], "compound": 3, "primari": 3, "kei": 3, "cluster": [3, 7, 9, 11], "column": 3, "kind": 3, "effici": 3, "sort": [3, 14], "order": 3, "BY": 3, "wa": [3, 14], "ineffici": 3, "ks1": 3, "table_demo": 3, "text": 3, "type": [3, 9, 14], "int": 3, "WITH": 3, "desc": 3, "select": 3, "cat1": 3, "asc": 3, "side": 3, "user": [3, 4, 9, 11, 12], "overhead": 3, "These": 3, "care": 3, "thing": 3, "mani": 3, "exist": [3, 11, 14], "much": 3, "drop": 3, "row": [3, 14], "were": 3, "match": [3, 11], "reason": [3, 8, 13, 14], "A": [3, 12, 13, 14], "determin": 3, "common": [3, 12], "quorum": 3, "major": 3, "success": 3, "hurt": 3, "persist": [3, 4, 7, 9, 11, 12], "lost": [3, 11, 12, 14], "cl": 3, "unavail": 3, "oper": 3, "expens": 3, "term": 3, "cost": 3, "ONE": 3, "end": [3, 9, 11], "local": [3, 8, 9, 11, 12, 13, 14], "local_quorum": 3, "local_on": 3, "instead": [3, 9, 11, 13], "reli": 3, "definit": [3, 14], "per": [3, 7, 9, 11, 13], "center": [3, 9, 11, 13], "scylla_serv": [3, 4, 8, 9, 11], "If": [3, 8, 9, 11, 12, 13, 14], "nearest": 3, "sh": [4, 5, 8, 11], "kill": [4, 8, 11], "script": [4, 5, 11, 12, 14], "altern": [4, 11], "method": [4, 11], "manual": [4, 8], "step": [4, 8, 9, 13, 14], "simplifi": 4, "start_al": 4, "launch": 4, "particular": 4, "updat": [4, 8, 9, 14], "ignor": [4, 12], "instal": [4, 5, 8], "among": 4, "ip": [4, 8, 9, 10, 11, 12, 13], "address": [4, 8, 9, 10, 11, 12, 13], "alertmanag": [4, 5, 12], "either": [4, 11], "consul": [4, 12], "manag": [4, 5, 6, 9], "config": [4, 9, 12], "product": [4, 12], "accordingli": 4, "its": [4, 11, 12, 13, 14], "note": [4, 8, 9, 11, 12], "latter": 4, "tell": 4, "themselv": [4, 14], "run": [4, 5, 6, 8, 9, 11, 12, 13, 14], "command": [4, 8, 11, 13], "datasourc": [4, 9, 11, 13, 14], "under": [4, 9, 11], "yaml": [4, 9, 10, 11], "To": [4, 7, 9, 10, 11, 14], "sashboard": 4, "t": [4, 14], "line": [4, 11, 12, 13, 14], "flag": [4, 8, 11, 12, 13, 14], "v": [4, 8, 11, 12, 13, 14], "version": [4, 5, 6, 8, 9, 12, 14], "enterpris": [4, 6, 11, 14], "2020": [4, 6, 11, 14], "1": [4, 6, 9, 11, 12, 13, 14], "pass": [4, 11, 12], "call": [4, 11, 12], "servic": [4, 8, 9, 11, 12], "container_nam": 4, "aalert": 4, "imag": [4, 8], "prom": [4, 8, 13], "v0": [4, 9], "21": 4, "port": [4, 8, 9, 10, 11, 12], "9093": [4, 9], "volum": [4, 7, 9, 11], "agraf": 4, "environ": [4, 12], "gf_panels_disable_sanitize_html": 4, "true": [4, 14], "gf_paths_provis": 4, "var": [4, 9], "lib": [4, 9], "gf_plugins_allow_loading_unsigned_plugin": 4, "scylladb": [4, 9, 11], "secur": 4, "gf_auth_basic_en": 4, "fals": [4, 9, 14], "gf_auth_anonymous_en": 4, "gf_auth_anonymous_org_rol": 4, "admin": [4, 11, 12], "gf_security_admin_password": 4, "7": [4, 9, 11, 14], "5": [4, 6, 7, 8, 9, 11, 14], "3000": [4, 9, 11], "1000": 4, "build": [4, 9], "plugin": [4, 9], "uncom": [4, 11], "dir": [4, 12, 13], "loki": [4, 11], "mnt": 4, "3100": 4, "conf": [4, 9, 11], "promotheu": 4, "aprom": [4, 8], "v2": [4, 9], "18": [4, 9], "9090": [4, 8, 9, 13], "d": [4, 11, 12, 13], "scylla_manager_serv": [4, 8, 9, 11], "node_exporter_serv": [4, 9, 11], "promtail": 4, "1514": [4, 11], "9080": 4, "promtail_config": 4, "older": 5, "compon": 5, "wrap": 5, "docker": [5, 8, 12, 13], "collect": [5, 11, 12, 13], "store": [5, 9, 13, 14], "handl": [5, 11, 12], "choos": [5, 8], "topic": 5, "compos": 5, "interfac": [5, 8], "deploi": [5, 11], "without": [5, 11, 12, 14], "troubleshoot": 5, "guid": [5, 8, 11], "integr": 5, "upgrad": 5, "advisor": 5, "ad": [5, 7, 9, 11, 12], "modifi": 5, "thano": 5, "matrix": 5, "lesson": 5, "univers": 5, "node_export": [6, 8, 9, 11, 12], "4": [6, 9, 11, 14], "2019": [6, 11], "17": [6, 8, 9, 11], "2018": 6, "14": [6, 8], "agent": [6, 8, 11, 12, 13], "o": [6, 12], "cpu": [7, 9, 11], "least": [7, 9, 11], "physic": [7, 9, 11], "core": [7, 9, 11], "4vcpu": [7, 9, 11], "memori": [7, 9, 11], "15gb": [7, 9, 11], "dram": [7, 9, 11], "storag": [7, 9, 11, 12, 14], "proport": [7, 9, 11], "number": [7, 9, 11, 13], "retent": [7, 9, 11], "network": [7, 8, 9, 11, 12], "1gbe": [7, 9, 11], "10gbe": [7, 9, 11], "prefer": [7, 8, 9, 11], "block": [7, 9, 11], "ec2": [7, 9, 11], "eb": [7, 9, 11], "15": [7, 9, 11], "dai": [7, 9, 11, 12], "around": [7, 8, 9, 11], "200mb": [7, 9, 11], "scrape": [7, 9, 11], "interv": [7, 9, 11], "16": [7, 8, 9, 11], "20gb": [7, 9, 11], "account": [7, 9, 11], "unexpect": [7, 9, 11], "event": [7, 9, 11], "replac": [7, 9, 11, 13, 14], "alloc": [7, 9, 11], "x4": [7, 9, 11], "100gb": [7, 9, 11], "fast": [7, 9, 11], "enough": [7, 9, 11], "provid": [7, 9, 11, 13], "out": [7, 9, 11, 13], "box": [7, 9, 11, 13], "done": [8, 11, 12, 14], "chang": [8, 10, 12, 14], "56090": [8, 9], "5090": [8, 11], "backward": [8, 14], "compat": [8, 14], "old": 8, "new": [8, 11], "howev": 8, "twice": 8, "easiest": 8, "edit": [8, 9, 11, 12, 13, 14], "remov": 8, "scylla_manager1": 8, "job": [8, 11], "take": [8, 11, 12, 14], "effect": [8, 11, 14], "messag": 8, "wait": 8, "log": [8, 11, 13], "failur": [8, 12], "root": [8, 11], "post": 8, "becaus": [8, 12], "own": [8, 11, 12], "proper": 8, "past": 8, "ownership": 8, "cento": [8, 9], "l": [8, 11, 12], "la": 8, "grep": 8, "drwxr": 8, "xr": 8, "x": [8, 14], "4096": 8, "jun": 8, "25": 8, "51": 8, "sudo": [8, 9, 11], "chown": 8, "r": [8, 9, 12, 14], "appear": 8, "unreach": 8, "immedi": 8, "suspect": 8, "connect": [8, 10, 13, 14], "login": [8, 11], "consol": [8, 9], "browser": [8, 9, 11, 13, 14], "http": [8, 9, 11, 13], "go": [8, 11], "target": [8, 9, 10, 12, 14], "tab": 8, "127": [8, 9, 12], "insid": [8, 9, 11, 12, 14], "host": [8, 9, 11, 12], "try": [8, 9], "enabl": [8, 11, 13], "confirm": 8, "pull": [8, 11], "align": 8, "option": [8, 11, 13], "procedur": [8, 9, 11], "p": [8, 9, 12, 13], "id": [8, 14], "statu": [8, 11], "41bd3db26240": 8, "entrypoin": 8, "ago": 8, "23": 8, "7000": [8, 11], "7001": 8, "tcp": 8, "9042": 8, "9160": 8, "9180": [8, 9, 10, 11], "10000": 8, "gui": [8, 12, 14], "click": 8, "fetch": 8, "curl": 8, "scylla_nod": 8, "binari": [8, 11], "firewal": [8, 11], "172": [8, 9, 11], "machin": [8, 11, 12], "ef": 8, "gre": 8, "scylla_setup": 8, "9100": 8, "pleas": [8, 9], "while": 8, "captur": 8, "tshark": 8, "f": 8, "dst": 8, "eth0": 8, "toward": 8, "199": 8, "203": 8, "229": 8, "89": 8, "12": [8, 14], "142": 8, "66": [8, 9], "59212": 8, "ack": 8, "seq": 8, "317": 8, "78193": 8, "158080": 8, "len": 8, "tsval": 8, "79869679": 8, "tsecr": 8, "3347447210": 8, "74": 8, "60440": 8, "syn": 8, "29200": 8, "mss": 8, "1460": 8, "sack_perm": 8, "79988291": 8, "w": [8, 14], "128": 8, "instruct": [9, 11], "main": 9, "item": 9, "indefinit": 9, "accru": 9, "solut": [9, 13], "churn": 9, "download": [9, 11], "latest": [9, 11, 12], "releas": 9, "wget": [9, 11], "github": [9, 11], "com": [9, 11], "archiv": [9, 11], "tar": [9, 11], "gz": [9, 11], "xvf": [9, 11], "20": 9, "linux": 9, "amd64": 9, "copi": 9, "cp": 9, "home": 9, "cd": [9, 11], "verifi": 9, "point": [9, 11, 14], "192": [9, 11], "168": [9, 11], "135": 9, "166": 9, "correct": 9, "static": 9, "honor_label": 9, "paramet": [9, 12], "vi": 9, "alertmang": 9, "am_address": 9, "same": [9, 11], "static_config": [9, 11], "manager_ag": 9, "global": [9, 11], "scrape_interv": [9, 11], "everi": [9, 11, 12], "scrape_timeout": 9, "timeout": 9, "scape": 9, "again": [9, 11], "attach": 9, "seri": [9, 13], "commun": 9, "feder": 9, "remot": 9, "external_label": 9, "scrape_config": 9, "job_nam": [9, 11], "file_sd_config": 9, "relabel_config": 9, "source_label": 9, "__address__": 9, "regex": 9, "target_label": 9, "those": 9, "must": [9, 11], "even": [9, 11, 12], "cat": 9, "list": [9, 11], "244": 9, "cluster1": [9, 11], "dc": [9, 11, 13], "dc1": [9, 11], "dc2": [9, 11], "previou": 9, "deprec": 9, "mkdir": 9, "mydata": 9, "tsdb": [9, 12, 13], "accumul": 9, "visibl": 9, "execut": 9, "queri": 9, "through": 9, "node_memory_memfre": 9, "And": 9, "scylla_reactor_util": 9, "At": [9, 14], "emit": 9, "abl": [9, 13], "grafna": 9, "depend": [9, 13], "repositori": [9, 11], "yum": 9, "zip": 9, "structur": 9, "rest": [9, 13], "access": [9, 12], "packag": 9, "public": 9, "app": 9, "provis": [9, 11, 14], "manager_2": 9, "ver_4": 9, "folder": 9, "apivers": 9, "url": [9, 13], "167": 9, "proxi": 9, "basicauth": 9, "camptocamp": 9, "orgid": 9, "typelogourl": 9, "img": 9, "icn": 9, "svg": 9, "password": [9, 11, 12], "isdefault": 9, "jsondata": 9, "severity_crit": 9, "severity_high": 9, "severity_warn": 9, "severity_info": 9, "sampl": 9, "ini": 9, "reflect": 9, "bin": 9, "assumpt": 9, "colloc": 9, "expos": [10, 13], "onlin": 10, "listen": [10, 11, 12], "inform": [10, 11, 12, 14], "api": [10, 12, 13], "disabl": [10, 11], "prometheus_port": 10, "bind": [10, 12], "restrict": 10, "prometheus_address": 10, "setup": 11, "dedic": 11, "over": 11, "evalu": 11, "laptop": 11, "groupadd": 11, "next": [11, 12, 13], "usermod": 11, "ag": 11, "systemctl": 11, "extract": 11, "As": [11, 14], "clone": 11, "git": 11, "directli": 11, "checkout": 11, "branch": 11, "restart": [11, 12, 13], "wish": [11, 12], "import": [11, 12], "datacent": 11, "nodetool": 11, "valid": 11, "ipv6": 11, "squar": 11, "bracket": 11, "2600": 11, "1f18": 11, "26b1": 11, "3a00": 11, "fac8": 11, "118e": 11, "9199": 11, "67b9": 11, "67ba": 11, "web": [11, 13], "overrid": [11, 12, 14], "n": [11, 12], "my_scylla_serv": 11, "prometheus_data": 11, "mark": 11, "seen": 11, "genconfig": 11, "py": [11, 14], "myconf": 11, "four": 11, "OR": 11, "cql": 11, "protect": 11, "author": [11, 12], "assign": 11, "keyspac": 11, "securejsondata": 11, "outsid": [11, 12], "permiss": 11, "somewher": 11, "els": [11, 12], "myservic": 11, "m": [11, 12], "function": [11, 13], "featur": [11, 13], "direct": 11, "programnam": 11, "rsyslog_syslogprotocol23format": 11, "authent": [11, 12], "simplest": 12, "small": 12, "util": [12, 14], "appropri": 12, "h": [12, 14], "print": 12, "exit": 12, "applic": 12, "localhost": 12, "cannot": 12, "map": 12, "explicit": 12, "encapsul": 12, "param": 12, "allow": 12, "auto": 12, "automat": 12, "g": 12, "keep": 12, "clear": 12, "comma": 12, "separ": 12, "j": 12, "c": 12, "variabl": 12, "alter": 12, "q": 12, "anonym": 12, "role": 12, "privileg": 12, "behavior": 12, "editor": 12, "viewer": 12, "suppli": [12, 14], "b": 12, "resolv": 12, "explicitli": [12, 14], "week": 12, "opportun": 12, "demonstr": 12, "cover": 12, "30d": 12, "arbitrari": 12, "opensourc": 13, "top": 13, "additiuon": 13, "high": [13, 14], "horizont": 13, "scale": 13, "backup": 13, "flexibl": 13, "design": 13, "front": 13, "few": 13, "why": [13, 14], "total": [13, 14], "million": 13, "capac": 13, "sometim": 13, "reachabl": 13, "lifecycl": 13, "z": 13, "thanosio": 13, "grpc": 13, "10911": 13, "grace": 13, "10912": 13, "after": [13, 14], "togeth": 13, "ip1": 13, "ip2": 13, "debug": 13, "query0": 13, "level": 13, "10903": 13, "10904": 13, "abov": 13, "last": 13, "db_address": 13, "explain": 14, "whenev": 14, "gone": 14, "save": 14, "mention": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "suggest": 14, "maintain": 14, "json": 14, "too": 14, "verbos": 14, "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": 14, "fill": 14, "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "27": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "22": 14, "gridpo": 14, "y": 14, "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "nullpointmod": 14, "pointradiu": 14, "render": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": 14, "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "tooltip": 14, "msresolut": 14, "share": 14, "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "resembl": 14, "css": 14, "hierarch": 14, "inherit": 14, "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "150px": 14, "output": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "e": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": 14, "larger": 14, "longer": 14, "later": 14, "absolut": 14, "posit": 14, "ie": 14, "width": 14, "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": 14, "calcul": 14, "taken": 14, "still": 14, "unlik": 14, "partial": 14, "24": 14, "don": 14, "python": 14, "make_dashboard": 14, "revers": 14, "easier": 14, "wrapper": 14, "re": 14, "just": 14, "refresh": 14, "generate_gener": 14, "mayb": 14}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 5, 6, 8, 9, 10, 11, 13], "monitor": [1, 5, 6, 8, 9, 10, 11, 13], "stack": [1, 5, 6, 8, 9, 10, 11, 13], "advisor": 1, "The": [1, 3, 12, 14], "section": 1, "alert": [2, 12], "prometheu": [2, 4, 7, 9, 10, 11, 12, 13], "alertmanag": [2, 9], "tip": 2, "when": 2, "ad": [2, 14], "an": [2, 11], "cql": 3, "optim": 3, "prepar": 3, "statement": 3, "token": 3, "awar": 3, "page": 3, "queri": [3, 13], "revers": 3, "read": 3, "allow": 3, "filter": 3, "consist": [3, 14], "level": [3, 8], "cross": 3, "dc": 3, "request": 3, "us": [4, 11, 13, 14], "docker": [4, 9, 11], "compos": 4, "prerequisit": [4, 11, 14], "set": 4, "grafana": [4, 8, 9, 11, 12, 14], "provis": 4, "data": [4, 8, 11, 13], "sourc": [4, 8, 13], "file": [4, 8, 11], "dashboard": [4, 11, 14], "load": 4, "start": [4, 8, 11, 12], "stop": [4, 11], "support": [6, 12], "matrix": 6, "minim": [7, 9, 11], "product": [7, 9, 11], "system": [7, 9, 11, 14], "recommend": [7, 9, 11], "calcul": [7, 9, 11], "disk": [7, 9, 11], "space": [7, 9, 11], "requir": [7, 9, 11], "troubleshoot": 8, "problem": 8, "manag": [8, 11, 12], "2": 8, "duplic": 8, "inform": 8, "A": 8, "contain": 8, "fail": 8, "To": 8, "And": 8, "directori": [8, 11], "permiss": 8, "No": 8, "point": 8, "solut": 8, "chart": 8, "show": 8, "error": 8, "sign": 8, "server": 8, "metric": 8, "notic": 8, "user": 8, "upgrad": [8, 14], "open": 8, "3": 8, "0": 8, "enterpris": 8, "2019": 8, "1": 8, "work": 8, "wireshark": 8, "deploi": 9, "without": 9, "instal": [9, 11], "interfac": 10, "post": 11, "configur": [11, 13], "node": 11, "from": [11, 14], "consul": 11, "api": 11, "connect": 11, "extern": 11, "add": 11, "addit": 11, "target": 11, "specif": 11, "version": 11, "access": 11, "localhost": 11, "rsyslog": 11, "each": 11, "view": 11, "all": 12, "sh": [12, 14], "command": 12, "gener": [12, 14], "option": 12, "relat": 12, "ldap": 12, "retent": 12, "period": 12, "thano": 13, "With": 13, "As": 13, "aggreg": 13, "sidecar": 13, "updat": 13, "modifi": 14, "limit": 14, "between": 14, "restart": 14, "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": 14}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Scylla Monitoring Stack Advisor": [[1, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[1, "the-advisor-section"]], "Alerting": [[2, "alerting"]], "Prometheus Alerts": [[2, "prometheus-alerts"]], "Alertmanager": [[2, "alertmanager"]], "Tips When Adding an Alert": [[2, "tips-when-adding-an-alert"]], "The CQL Optimization": [[3, "the-cql-optimization"]], "Prepared Statements": [[3, "prepared-statements"]], "Token Aware": [[3, "token-aware"]], "Paged Queries": [[3, "paged-queries"]], "Reversed CQL Reads": [[3, "reversed-cql-reads"]], "ALLOW FILTERING": [[3, "allow-filtering"]], "Consistency Level": [[3, "consistency-level"]], "Cross DC": [[3, "cross-dc"]], "Cross DC Consistency Level": [[3, "cross-dc-consistency-level"]], "Cross DC read requests": [[3, "cross-dc-read-requests"]], "Using Docker Compose": [[4, "using-docker-compose"]], "Prerequisite": [[4, "prerequisite"], [14, "prerequisite"]], "Setting Prometheus": [[4, "setting-prometheus"]], "Setting Grafana Provisioning": [[4, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[4, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[4, "grafana-dashboard-load-file"]], "Docker Compose file": [[4, "docker-compose-file"]], "Start and Stop": [[4, "start-and-stop"]], "Scylla Monitoring Stack": [[5, "scylla-monitoring-stack"]], "Minimal Production System Recommendations": [[7, "minimal-production-system-recommendations"], [9, "minimal-production-system-recommendations"], [11, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[7, "calculating-prometheus-minimal-disk-space-requirement"], [9, "calculating-prometheus-minimal-disk-space-requirement"], [11, "calculating-prometheus-minimal-disk-space-requirement"]], "Scylla Monitoring Stack Support Matrix": [[6, "scylla-monitoring-stack-support-matrix"]], "Troubleshoot Scylla Monitoring Stack": [[8, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[8, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[8, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[8, "a-container-fails-to-start"]], "Files And Directory Permissions": [[8, "files-and-directory-permissions"]], "No Data Points": [[8, "no-data-points"]], "Solution": [[8, "solution"], [8, "id1"], [8, "id2"], [8, "id3"]], "Grafana Chart Shows Error (!) Sign": [[8, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[8, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[8, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[8, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[8, "working-with-wireshark"]], "Scylla Monitoring Stack Interfaces": [[10, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[10, "prometheus"]], "Deploying Scylla Monitoring Stack Without Docker": [[9, "deploying-scylla-monitoring-stack-without-docker"]], "Install Scylla Monitoring Stack": [[9, "install-scylla-monitoring-stack"], [11, "install-scylla-monitoring-stack"], [11, "id1"]], "Install Alertmanager": [[9, "install-alertmanager"]], "Install Prometheus": [[9, "install-prometheus"]], "Install Grafana": [[9, "install-grafana"]], "Prerequisites": [[11, "prerequisites"]], "Docker Post Installation": [[11, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[11, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[11, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[11, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[11, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[11, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[11, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[11, "start-and-stop-scylla-monitoring-stack"]], "Start": [[11, "start"]], "Stop": [[11, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[11, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[11, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[11, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[11, "view-grafana-dashboards"]], "The start-all.sh command": [[12, "the-start-all-sh-command"]], "General Options": [[12, "general-options"]], "Grafana Related Commands": [[12, "grafana-related-commands"]], "Grafana LDAP support": [[12, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[12, "prometheus-related-commands"]], "Prometheus Retention Period": [[12, "prometheus-retention-period"]], "Alert Manager": [[12, "alert-manager"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "consistency between restarts": [[14, "consistency-between-restarts"]], "consistency between upgrades": [[14, "consistency-between-upgrades"]], "Using templated Dashboards": [[14, "using-templated-dashboards"]], "The template class system": [[14, "the-template-class-system"]], "Panel example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Validation": [[14, "validation"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[13, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[13, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[13, "prometheus-configuration"]], "Thanos sidecar": [[13, "thanos-sidecar"]], "Thanos query": [[13, "thanos-query"]], "Update Scylla Data source": [[13, "update-scylla-data-source"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.6/sitemap.xml b/branch-3.6/sitemap.xml new file mode 100644 index 000000000..de13da892 --- /dev/null +++ b/branch-3.6/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/advisor.htmlhttps://monitoring.docs.scylladb.com/stable/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.6/start_all.html b/branch-3.6/start_all.html new file mode 100644 index 000000000..9133f703f --- /dev/null +++ b/branch-3.6/start_all.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            The start-all.sh command

            +

            Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

            +

            The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

            +
            +

            General Options

            +

            -h Help, Print the help, and exit.

            +

            –version print the current Scylla-Monitoring stack version, and exit.

            +

            -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

            +

            -A bind-to-ip-address Bind the listening-address to an explicit IP address.

            +

            -D encapsulate docker param Allows passing additional parameters to all the docker containers.

            +

            –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

            +
            + + +
            +

            Alert Manager

            +

            alertmanager handles the alerts and takes the following parameters:

            +

            -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

            +

            -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

            +

            -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/thanos.html b/branch-3.6/thanos.html new file mode 100644 index 000000000..785f7de9a --- /dev/null +++ b/branch-3.6/thanos.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Using Thanos as Data Source With Scylla Monitoring Stack

            +

            Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as:

            +
              +
            • High-availability.

            • +
            • Horizontal scaling.

            • +
            • Backup.

            • +
            +

            The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

            +

            The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

            +
            +

            Using Thanos As a Prometheus Aggregator

            +

            There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

            +
            +

            Prometheus Configuration

            +

            We will assume you have two Prometheus servers running.

            +
              +
            1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

            2. +
            3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

            4. +
            +
            +
            +

            Thanos sidecar

            +

            The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

            +
            docker run -d \
            + -v /path/to/prom/dir:/data/prom:z \
            + -i --name sidecar thanosio/thanos \
            + sidecar \
            + --grpc-address=0.0.0.0:10911 \
            + --grpc-grace-period=1s \
            + --http-address=0.0.0.0:10912 \
            + --http-grace-period=1s \
            + --prometheus.url=http://prometheus-ip:9090 \
            + --tsdb.path=/data/prom \
            + -p 10912:10912 \
            + -p 10911:10911
            +
            +
            +

            After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

            +
            +
            +

            Thanos query

            +

            Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

            +
            docker run -d \
            + --name thanos -- thanosio/thanos \
            +   query \
            +   --debug.name=query0 \
            +   --log.level=debug \
            +   --grpc-address=0.0.0.0:10903 \
            +   --grpc-grace-period=1s \
            +   --http-address=0.0.0.0:10904 \
            +   --http-grace-period=1s \
            +   --query.replica-label=prometheus \
            +   --store={ip1}:10911 --store={ip2}:10911
            +
            +
            +

            After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

            +
            +
            +

            Update Scylla Data source

            +

            The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

            +

            The file you edit is a template file that replaces the file Grafana uses, next time you start.

            +

            Restart the Scylla Monitoring Stack it should now use Thanos.

            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.6/updating_dashboard.html b/branch-3.6/updating_dashboard.html new file mode 100644 index 000000000..ea7d99061 --- /dev/null +++ b/branch-3.6/updating_dashboard.html @@ -0,0 +1,900 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +
            +

            Adding and Modifying Dashboards

            +

            The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

            +

            It will explain about Scylla Monitoring Stack dashboard templates and how to modify them.

            + +
            +

            General Limitations

            +

            Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

            +
            +

            consistency between restarts

            +

            By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

            +
            +
            +

            consistency between upgrades

            +

            As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

            +
            +

            Note

            +

             You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

            +
            +

            At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

            +
            +
            +
            +

            Using templated Dashboards

            +

            Why does Scylla Monitor use dashboard templates?

            +

            We found the Grafana dashboards Json format too verbose to be maintainable.

            +

            Each element in the dashboard file (Each Json object) contains all of its attributes and values.

            +

            For example a typical graph panel would look like:

            +
            {
            +    "aliasColors": {},
            +    "bars": false,
            +    "datasource": "prometheus",
            +    "editable": true,
            +    "error": false,
            +    "fill": 0,
            +    "grid": {
            +        "threshold1": null,
            +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
            +        "threshold2": null,
            +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
            +    },
            +    "gridPos": {
            +        "h": 6,
            +        "w": 10,
            +        "x": 0,
            +        "y": 4
            +    },
            +    "id": 2,
            +    "isNew": true,
            +    "legend": {
            +        "avg": false,
            +        "current": false,
            +        "max": false,
            +        "min": false,
            +        "show": false,
            +        "total": false,
            +        "values": false
            +    },
            +    "lines": true,
            +    "linewidth": 2,
            +    "links": [],
            +    "nullPointMode": "connected",
            +    "percentage": false,
            +    "pointradius": 5,
            +    "points": false,
            +    "renderer": "flot",
            +    "seriesOverrides": [
            +        {}
            +    ],
            +    "span": 5,
            +    "stack": false,
            +    "steppedLine": false,
            +    "targets": [
            +        {
            +            "expr": "sum(node_filesystem_avail) by (instance)",
            +            "intervalFactor": 1,
            +            "legendFormat": "",
            +            "refId": "A",
            +            "step": 1
            +        }
            +    ],
            +    "timeFrom": null,
            +    "timeShift": null,
            +    "title": "Available Disk Size",
            +    "tooltip": {
            +        "msResolution": false,
            +        "shared": true,
            +        "sort": 0,
            +        "value_type": "cumulative"
            +    },
            +    "transparent": false,
            +    "type": "graph",
            +    "xaxis": {
            +        "show": true
            +    },
            +    "yaxes": [
            +        {
            +            "format": "percent",
            +            "logBase": 1,
            +            "max": 101,
            +            "min": 0,
            +            "show": true
            +        },
            +        {
            +            "format": "short",
            +            "logBase": 1,
            +            "max": null,
            +            "min": null,
            +            "show": true
            +        }
            +    ]
            +}
            +
            +
            +

            As you can imagine, most panels would have similar values.

            +

            To reduce the redundancy of Grafana JSON format, we added dashboard templates.

            +
            +

            The template class system

            +

            Scylla Monitoring Stack dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

            +

            The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

            +

            In the template file, you can also add or override attributes.

            +

            The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

            +

            When generating dashboards, each class will be replaced by its definition.

            +

            For example row in the type.json defined

            +
            {
            + "base_row": {
            +     "collapse": false,
            +     "editable": true
            + },
            + "row": {
            +     "class": "base_row",
            +     "height": "250px"
            + }
            + }
            +
            +
            +

            In a Template it will be used like

            +
            {
            +     "class": "row",
            +     "height": "150px",
            +     "panels": [
            +     ]
            +}
            +
            +
            +

            The output will be

            +
            {
            +     "class": "row",
            +     "collapse": false,
            +     "editable": true,
            +     "height": "150px",
            +     "panels": [
            +
            +     ]
            +}
            +
            +
            +

            We can see that the template added the panels attribute and override the height attribute.

            +
            +
            +

            Panel example

            +

            Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

            +
            {
            +     "class": "row",
            +     "panels": [
            +         {
            +             "class": "bytes_panel",
            +             "span": 3,
            +             "targets": [
            +                 {
            +                     "expr": "sum(node_filesystem_avail) by (instance)",
            +                     "intervalFactor": 1,
            +                     "legendFormat": "",
            +                     "metric": "",
            +                     "refId": "A",
            +                     "step": 1
            +                 }
            +             ],
            +             "title": "Available Disk Size"
            +         }
            +     ]
            +}
            +
            +
            +

            In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

            +

            You can also see that we override the span attribute to set the panel size.

            +

            To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

            +
            +
            +

            Grafana Formats and Layouts

            +

            The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

            +

            Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

            +

            The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

            +

            To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

            +

            The panel’s height will be taken from their row. The span attribute is still supported as is row height.

            +

            you can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

            +

            gridPos has the following attributes:

            +
            {
            +   "x": 0,
            +   "y": 0,
            +   "w": 24,
            +   "h": 4
            + }
            +
            +
            +

            When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

            +
            {
            +   "gridPos": {
            +      "h": 2
            +    }
            +}
            +
            +
            +
            +
            +

            Generating the dashboards from templates (generate-dashboards.sh)

            +
            +

            Prerequisite

            +

            Python 2.7

            +

            make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

            +

            Use the -h flag to get help information.

            +

            You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

            +

            When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

            +

            For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

            +

            .\generate-dashboards.sh -v 2020.1

            +
            +

            Note

            +

            generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

            +
            +
            +
            +
            +

            Validation

            +

            After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

            +

            Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

            +
            +
            +
            + + +
            + + + + + + + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.7/.buildinfo b/branch-3.7/.buildinfo new file mode 100644 index 000000000..c05e108e0 --- /dev/null +++ b/branch-3.7/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 1bc0242f72c037e854b3ce7efecfc403 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.7/.doctrees/_common/monitor-description.doctree b/branch-3.7/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..702ccaf81 Binary files /dev/null and b/branch-3.7/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.7/.doctrees/environment.pickle b/branch-3.7/.doctrees/environment.pickle new file mode 100644 index 000000000..edc324599 Binary files /dev/null and b/branch-3.7/.doctrees/environment.pickle differ diff --git a/branch-3.7/.doctrees/index.doctree b/branch-3.7/.doctrees/index.doctree new file mode 100644 index 000000000..52d4fb6c9 Binary files /dev/null and b/branch-3.7/.doctrees/index.doctree differ diff --git a/branch-3.7/.doctrees/install/docker_compose.doctree b/branch-3.7/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..b64c8c130 Binary files /dev/null and b/branch-3.7/.doctrees/install/docker_compose.doctree differ diff --git a/branch-3.7/.doctrees/install/index.doctree b/branch-3.7/.doctrees/install/index.doctree new file mode 100644 index 000000000..4ffa74fde Binary files /dev/null and b/branch-3.7/.doctrees/install/index.doctree differ diff --git a/branch-3.7/.doctrees/install/min-prod-hw.doctree b/branch-3.7/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..93fddfc5b Binary files /dev/null and b/branch-3.7/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-3.7/.doctrees/install/monitor_without_docker.doctree b/branch-3.7/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..d1bb72974 Binary files /dev/null and b/branch-3.7/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-3.7/.doctrees/install/monitoring_stack.doctree b/branch-3.7/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..aaafa1819 Binary files /dev/null and b/branch-3.7/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-3.7/.doctrees/install/start_all.doctree b/branch-3.7/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..f07ab9f1e Binary files /dev/null and b/branch-3.7/.doctrees/install/start_all.doctree differ diff --git a/branch-3.7/.doctrees/install/thanos.doctree b/branch-3.7/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..9cdef7089 Binary files /dev/null and b/branch-3.7/.doctrees/install/thanos.doctree differ diff --git a/branch-3.7/.doctrees/procedures/alerts/alerting.doctree b/branch-3.7/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..f556e8f94 Binary files /dev/null and b/branch-3.7/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-3.7/.doctrees/procedures/alerts/index.doctree b/branch-3.7/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..b155da3df Binary files /dev/null and b/branch-3.7/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-3.7/.doctrees/procedures/index.doctree b/branch-3.7/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..f957b643a Binary files /dev/null and b/branch-3.7/.doctrees/procedures/index.doctree differ diff --git a/branch-3.7/.doctrees/procedures/updating_dashboard.doctree b/branch-3.7/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..b4772bdda Binary files /dev/null and b/branch-3.7/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-3.7/.doctrees/reference/index.doctree b/branch-3.7/.doctrees/reference/index.doctree new file mode 100644 index 000000000..1a00a8c98 Binary files /dev/null and b/branch-3.7/.doctrees/reference/index.doctree differ diff --git a/branch-3.7/.doctrees/reference/matrix.doctree b/branch-3.7/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..c92755fb1 Binary files /dev/null and b/branch-3.7/.doctrees/reference/matrix.doctree differ diff --git a/branch-3.7/.doctrees/reference/monitoring_apis.doctree b/branch-3.7/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..0f63ca12f Binary files /dev/null and b/branch-3.7/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-3.7/.doctrees/troubleshooting/index.doctree b/branch-3.7/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..f94c1ac07 Binary files /dev/null and b/branch-3.7/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-3.7/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-3.7/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..02803d621 Binary files /dev/null and b/branch-3.7/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..19f185288 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..0aef06a27 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..04bc61296 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..b5d063bf8 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..3697f5b91 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..84dee8a88 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..d7f7ce0d8 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/index.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..be4aa078a Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..d4c229578 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..349452cb6 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..f7736a68c Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-3.7/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..16b20f583 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/cql_optimization.doctree b/branch-3.7/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..215b16d8e Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-3.7/.doctrees/use-monitoring/index.doctree b/branch-3.7/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..8a4aac2e5 Binary files /dev/null and b/branch-3.7/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-3.7/.nojekyll b/branch-3.7/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.7/404.html b/branch-3.7/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.7/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
            +

            404

            +

            The ScyllaDB monster ate your page!

            +

            + Home +

            +
            + + + \ No newline at end of file diff --git a/branch-3.7/CNAME b/branch-3.7/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.7/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.7/_common/monitor-description.html b/branch-3.7/_common/monitor-description.html new file mode 100644 index 000000000..d5635782a --- /dev/null +++ b/branch-3.7/_common/monitor-description.html @@ -0,0 +1,625 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + + +
            +
            + Menu +
            +
            +
            +
            +
            + + +
            +

            Caution

            +

            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

            +
            + + + +
            + +
            + +

            Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

            + + +
            + + + + + +
            + + +
            + +
            + +
            + + + + +
            + + + + + + + \ No newline at end of file diff --git a/branch-3.7/_images/1.png b/branch-3.7/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.7/_images/1.png differ diff --git a/branch-3.7/_images/2.png b/branch-3.7/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.7/_images/2.png differ diff --git a/branch-3.7/_images/3.png b/branch-3.7/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.7/_images/3.png differ diff --git a/branch-3.7/_images/advisor_panel.png b/branch-3.7/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.7/_images/advisor_panel.png differ diff --git a/branch-3.7/_images/alertmanager.png b/branch-3.7/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.7/_images/alertmanager.png differ diff --git a/branch-3.7/_images/cql_optimization_master.png b/branch-3.7/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.7/_images/cql_optimization_master.png differ diff --git a/branch-3.7/_images/grafana.png b/branch-3.7/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.7/_images/grafana.png differ diff --git a/branch-3.7/_images/monitor.png b/branch-3.7/_images/monitor.png new file mode 100644 index 000000000..26d107a71 Binary files /dev/null and b/branch-3.7/_images/monitor.png differ diff --git a/branch-3.7/_images/monitoring_stack.png b/branch-3.7/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.7/_images/monitoring_stack.png differ diff --git a/branch-3.7/_sources/_common/monitor-description.rst.txt b/branch-3.7/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.7/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.7/_sources/index.rst.txt b/branch-3.7/_sources/index.rst.txt new file mode 100644 index 000000000..4ab026528 --- /dev/null +++ b/branch-3.7/_sources/index.rst.txt @@ -0,0 +1,36 @@ +Scylla Monitoring Stack +======================= + +.. toctree:: + :maxdepth: 1 + :hidden: + + User Guide + Download and Install + Procedures + Troubleshooting + Reference + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-3.7/_sources/install/docker_compose.rst.txt b/branch-3.7/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.7/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.7/_sources/install/index.rst.txt b/branch-3.7/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-3.7/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-3.7/_sources/install/min-prod-hw.rst.txt b/branch-3.7/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..db5d9c860 --- /dev/null +++ b/branch-3.7/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,24 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need **minimal** disk space of + +.. code:: + + 6 * 16 * 200MB ~ 20GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. diff --git a/branch-3.7/_sources/install/monitor_without_docker.rst.txt b/branch-3.7/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..f272f6d7d --- /dev/null +++ b/branch-3.7/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,381 @@ +Deploying Scylla Monitoring Stack Without Docker +================================================ + +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before beginning that your Grafana and Prometheus versions are supported by the Monitoring Stack version you want to install. See the :ref:`Scylla Monitoring Stack Compatibility Matrix `. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-3.5.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.20.0 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz + tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.20.0.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + + +Install Prometheus +------------------ + +Tested with Prometheus version 2.18.1 + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz + tar -xvf prometheus-2.18.1.linux-amd64.tar.gz + +2. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64 + cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml + + +3. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi prometheus-2.18.1.linux-amd64/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +4. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:56090 + +5. Create a data directory for Prometheus to store the metrics data + +For example: + +.. code-block:: shell + + mkdir prometheus-2.18.1.linux-amd64/mydata + + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd prometheus-2.18.1.linux-amd64 + ./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata + +Data should start accumulate on: ./mydata + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + + +Install Grafana +--------------- + +Tested with Grafna 6.7.3 + +1. Install Grafana based on the instructions `here`_ make sure to use version 6.7.0 or higher + +.. _`here` : http://docs.grafana.org/installation/ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.5/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-6.7.3/public/app + +4. Provision the Dashboard them + +For example Scylla version 4.0 and Scylla manager version 2.0 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-6.7.3/public/build/ + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml + cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-6.7.3/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.0.yaml`` would point to: ``/home/centos/grafana-6.7.3/public/build/ver_4.0`` and the FOLDER will be ``4.0`` + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-6.7.3/data/plugins + provisioning = /home/centos/grafana-6.7.3/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-6.7.3/ + ./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.7/_sources/install/monitoring_stack.rst.txt b/branch-3.7/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..82f134921 --- /dev/null +++ b/branch-3.7/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,378 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Stack Without Docker `_ . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. _Monitoring_Stack_Compatibility_Matrix: + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.7 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://scylladb.github.io/scylla-manager/2.2/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.7/_sources/install/start_all.rst.txt b/branch-3.7/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..752a98a12 --- /dev/null +++ b/branch-3.7/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "-storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.7/_sources/install/thanos.rst.txt b/branch-3.7/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..ffaf430af --- /dev/null +++ b/branch-3.7/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912 + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903 + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + \ No newline at end of file diff --git a/branch-3.7/_sources/procedures/alerts/alerting.rst.txt b/branch-3.7/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.7/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.7/_sources/procedures/alerts/index.rst.txt b/branch-3.7/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-3.7/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-3.7/_sources/procedures/index.rst.txt b/branch-3.7/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-3.7/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-3.7/_sources/procedures/updating_dashboard.rst.txt b/branch-3.7/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..5113102a8 --- /dev/null +++ b/branch-3.7/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,302 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It will explain about Scylla Monitoring Stack dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitoring Stack dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.7/_sources/reference/index.rst.txt b/branch-3.7/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-3.7/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-3.7/_sources/reference/matrix.rst.txt b/branch-3.7/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..f79874ca6 --- /dev/null +++ b/branch-3.7/_sources/reference/matrix.rst.txt @@ -0,0 +1,100 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.7/_sources/reference/monitoring_apis.rst.txt b/branch-3.7/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..6d64821bc --- /dev/null +++ b/branch-3.7/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.7/_sources/troubleshooting/index.rst.txt b/branch-3.7/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-3.7/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-3.7/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-3.7/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..2cc1457ea --- /dev/null +++ b/branch-3.7/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..98a3b14d3 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/scylla-essentials-overview/lessons/high-availability/topic/consistency-level/#:~:text=Some%20of%20the%20most%20common,availability%20with%20the%20lowest%20consistency. diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-3.7/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-3.7/_sources/use-monitoring/advisor/index.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..27758a7a3 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,43 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` diff --git a/branch-3.7/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-3.7/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-3.7/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-3.7/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-3.7/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-3.7/_sources/use-monitoring/cql_optimization.rst.txt b/branch-3.7/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..eafc82e4b --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.7/_sources/use-monitoring/index.rst.txt b/branch-3.7/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-3.7/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-3.7/_static/basic.css b/branch-3.7/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.7/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.7/_static/check-solid.svg b/branch-3.7/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.7/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.7/_static/clipboard.min.js b/branch-3.7/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.7/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.7/_static/copybutton.css b/branch-3.7/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.7/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

            Short

            + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.7/_static/copybutton.js b/branch-3.7/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.7/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.7/_static/copybutton_funcs.js b/branch-3.7/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.7/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.7/_static/css/main.css b/branch-3.7/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-3.7/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.7/_static/doctools.js b/branch-3.7/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.7/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.7/_static/documentation_options.js b/branch-3.7/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.7/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.7/_static/file.png b/branch-3.7/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.7/_static/file.png differ diff --git a/branch-3.7/_static/img/banner-background.svg b/branch-3.7/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.7/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.7/_static/img/favicon-228x228.png b/branch-3.7/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.7/_static/img/favicon-228x228.png differ diff --git a/branch-3.7/_static/img/favicon-32x32.png b/branch-3.7/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.7/_static/img/favicon-32x32.png differ diff --git a/branch-3.7/_static/img/favicon.ico b/branch-3.7/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.7/_static/img/favicon.ico differ diff --git a/branch-3.7/_static/img/icons/icon-about-team.svg b/branch-3.7/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.7/_static/img/icons/icon-about-us-m.svg b/branch-3.7/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-about-us.svg b/branch-3.7/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-alternator.svg b/branch-3.7/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-apps.svg b/branch-3.7/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-architecture.svg b/branch-3.7/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.7/_static/img/icons/icon-benchmarks.svg b/branch-3.7/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.7/_static/img/icons/icon-blog.svg b/branch-3.7/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.7/_static/img/icons/icon-careers.svg b/branch-3.7/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.7/_static/img/icons/icon-chevron-left.svg b/branch-3.7/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.7/_static/img/icons/icon-chevron-right.svg b/branch-3.7/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.7/_static/img/icons/icon-circe.svg b/branch-3.7/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-clock.svg b/branch-3.7/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-close.svg b/branch-3.7/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-cloud-docs.svg b/branch-3.7/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-cloud.svg b/branch-3.7/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-comparison.svg b/branch-3.7/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.7/_static/img/icons/icon-contact-us.svg b/branch-3.7/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.7/_static/img/icons/icon-developers-blog.svg b/branch-3.7/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.7/_static/img/icons/icon-docs.svg b/branch-3.7/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.7/_static/img/icons/icon-enterprise-m.svg b/branch-3.7/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-enterprise.svg b/branch-3.7/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-events.svg b/branch-3.7/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.7/_static/img/icons/icon-exclamation.svg b/branch-3.7/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-expand.svg b/branch-3.7/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-forum.svg b/branch-3.7/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-getting-started.svg b/branch-3.7/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-glossary.svg b/branch-3.7/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-home.svg b/branch-3.7/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-infoworld.svg b/branch-3.7/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.7/_static/img/icons/icon-integrations.svg b/branch-3.7/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-knowledge-base.svg b/branch-3.7/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-less.svg b/branch-3.7/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-live-test.svg b/branch-3.7/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.7/_static/img/icons/icon-mail-list.svg b/branch-3.7/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-manager.svg b/branch-3.7/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.7/_static/img/icons/icon-memory-management.svg b/branch-3.7/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.7/_static/img/icons/icon-modeling.svg b/branch-3.7/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-monitoring.svg b/branch-3.7/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.7/_static/img/icons/icon-networking.svg b/branch-3.7/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.7/_static/img/icons/icon-news.svg b/branch-3.7/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.7/_static/img/icons/icon-newsletter.svg b/branch-3.7/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.7/_static/img/icons/icon-nsql-guides.svg b/branch-3.7/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.7/_static/img/icons/icon-open-source.svg b/branch-3.7/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.7/_static/img/icons/icon-operator.svg b/branch-3.7/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-overview.svg b/branch-3.7/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.7/_static/img/icons/icon-partners.svg b/branch-3.7/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.7/_static/img/icons/icon-plus.svg b/branch-3.7/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-pricing.svg b/branch-3.7/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.7/_static/img/icons/icon-release-notes.svg b/branch-3.7/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.7/_static/img/icons/icon-resource-center.svg b/branch-3.7/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.7/_static/img/icons/icon-roadmap.svg b/branch-3.7/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.7/_static/img/icons/icon-search.svg b/branch-3.7/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.7/_static/img/icons/icon-slack.svg b/branch-3.7/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-stack-overflow.svg b/branch-3.7/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.7/_static/img/icons/icon-summit.svg b/branch-3.7/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/icons/icon-support.svg b/branch-3.7/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.7/_static/img/icons/icon-tech-talks.svg b/branch-3.7/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.7/_static/img/icons/icon-testing.svg b/branch-3.7/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.7/_static/img/icons/icon-thumbs-down.svg b/branch-3.7/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-thumbs-up.svg b/branch-3.7/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.7/_static/img/icons/icon-tip.svg b/branch-3.7/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.7/_static/img/icons/icon-training.svg b/branch-3.7/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.7/_static/img/icons/icon-triangle-down.svg b/branch-3.7/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.7/_static/img/icons/icon-university.svg b/branch-3.7/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.7/_static/img/icons/icon-users-blog.svg b/branch-3.7/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.7/_static/img/icons/icon-warning.svg b/branch-3.7/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.7/_static/img/icons/icon-webinars.svg b/branch-3.7/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.7/_static/img/icons/icon-whitepapers.svg b/branch-3.7/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.7/_static/img/icons/icon-workshop.svg b/branch-3.7/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.7/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.7/_static/img/logo-docs.svg b/branch-3.7/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.7/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.7/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.7/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.7/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.7/_static/img/mascots/404.jpg b/branch-3.7/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.7/_static/img/mascots/404.jpg differ diff --git a/branch-3.7/_static/img/mascots/scylla-3monsters.png b/branch-3.7/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.7/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-alternator.svg b/branch-3.7/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.7/_static/img/mascots/scylla-cloud.svg b/branch-3.7/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.7/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.7/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-computer-headset.png b/branch-3.7/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-cup-number-one.png b/branch-3.7/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-docs.svg b/branch-3.7/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.7/_static/img/mascots/scylla-drivers.svg b/branch-3.7/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.7/_static/img/mascots/scylla-enterprise.svg b/branch-3.7/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.7/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.7/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-forklift-migration.png b/branch-3.7/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-gear.png b/branch-3.7/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-hardhat.png b/branch-3.7/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-headband.png b/branch-3.7/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-headset.png b/branch-3.7/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-hearts.png b/branch-3.7/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-looking-down.png b/branch-3.7/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-looking-up.png b/branch-3.7/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.7/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.7/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-manager.svg b/branch-3.7/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.7/_static/img/mascots/scylla-monitor.svg b/branch-3.7/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.7/_static/img/mascots/scylla-movement-fast.png b/branch-3.7/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-movement.png b/branch-3.7/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-onpremise.png b/branch-3.7/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-opensource.svg b/branch-3.7/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.7/_static/img/mascots/scylla-operator.svg b/branch-3.7/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.7/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.7/_static/img/mascots/scylla-plugin.png b/branch-3.7/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-release-mascot.png b/branch-3.7/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-repair.png b/branch-3.7/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-server.png b/branch-3.7/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-sleeping.png b/branch-3.7/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-tall-measure.png b/branch-3.7/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-university.png b/branch-3.7/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-weights.png b/branch-3.7/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-window-cleaning.png b/branch-3.7/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-with-computer-2.png b/branch-3.7/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-with-computer.png b/branch-3.7/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-with-linux.png b/branch-3.7/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.7/_static/img/mascots/scylla-writting.png b/branch-3.7/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.7/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.7/_static/img/menu.svg b/branch-3.7/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.7/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.7/_static/img/scylla-monitor.png b/branch-3.7/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.7/_static/img/scylla-monitor.png differ diff --git a/branch-3.7/_static/js/main.bundle.js b/branch-3.7/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-3.7/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
          • Back
          • ',backButtonPosition:"top",wrapper:"
            ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
              "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
              ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
              ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
              ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
              ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
              "],col:[2,"","
              "],tr:[2,"","
              "],td:[3,"","
              "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + + + +
              + + + + + +
              + + +
              + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/index.html b/branch-3.7/index.html new file mode 100644 index 000000000..ac130b034 --- /dev/null +++ b/branch-3.7/index.html @@ -0,0 +1,648 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack

              +
              +
              +

              Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

              +_images/monitor.png +

              The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

              +
                +
              • prometheus - collects and stores metrics

              • +
              • alertmanager - handles alerts

              • +
              • grafana - dashboard server

              • +
              +

              Choose a topic to get started:

              + +

              For older versions of Scylla Monitoring Stack Documentation see here.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/docker_compose.html b/branch-3.7/install/docker_compose.html new file mode 100644 index 000000000..aafc2f62a --- /dev/null +++ b/branch-3.7/install/docker_compose.html @@ -0,0 +1,789 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Using Docker Compose

              +

              Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

              +

              Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

              +
              +

              Warning

              +

              docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

              +
              +
              +

              Prerequisite

              +

              Make sure you have docker and docker-compose installed.

              +
              +
              +

              Setting Prometheus

              +

              The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

              +

              You can use ./prometheus-config.sh to generate the file, for example:

              +
              ./prometheus-config.sh --compose
              +
              +
              +

              For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

              +
              +
              +

              Setting Grafana Provisioning

              +

              Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

              +
              +

              Grafana Data-Source file

              +

              Run the following command to update the datasource:

              +
              ./grafana-datasource.sh --compose
              +
              +
              +

              You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

              +
              +
              +

              Grafana Dashboard Load file

              +

              To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

              +
              ./generate-dashboards.sh -t -v 2020.1
              +
              +
              +

              This command generates the files under: grafana/provisioning/dashboards/

              +
              +
              +
              +

              Docker Compose file

              +

              You can use the following example as a base for your docker compose.

              +

              Pass the following to a file called docker-compose.yml

              +
              services:
              +  alertmanager:
              +    container_name: aalert
              +    image: prom/alertmanager:v0.21.0
              +    ports:
              +    - 9093:9093
              +    volumes:
              +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
              +  grafana:
              +    container_name: agraf
              +    environment:
              +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
              +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
              +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
              +    # This is where you set Grafana security
              +    - GF_AUTH_BASIC_ENABLED=false
              +    - GF_AUTH_ANONYMOUS_ENABLED=true
              +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
              +    - GF_SECURITY_ADMIN_PASSWORD=admin
              +    image: grafana/grafana:7.3.5
              +    ports:
              +    - 3000:3000
              +    user: 1000:1000
              +    volumes:
              +    - ./grafana/build:/var/lib/grafana/dashboards
              +    - ./grafana/plugins:/var/lib/grafana/plugins
              +    - ./grafana/provisioning:/var/lib/grafana/provisioning
              +    # Uncomment the following line for grafana persistency
              +    # - path/to/grafana/dir:/var/lib/grafana
              +  loki:
              +    command:
              +    - --config.file=/mnt/config/loki-config.yaml
              +    container_name: loki
              +    image: grafana/loki:2.0.0
              +    ports:
              +    - 3100:3100
              +    volumes:
              +    - ./loki/rules:/etc/loki/rules
              +    - ./loki/conf:/mnt/config
              +  promotheus:
              +    command:
              +    - --config.file=/etc/prometheus/prometheus.compose.yml
              +    container_name: aprom
              +    image: prom/prometheus:v2.18.1
              +    ports:
              +    - 9090:9090
              +    volumes:
              +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
              +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
              +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
              +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
              +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
              +    # Uncomment the following line for prometheus persistency 
              +    # - path/to/data/dir:/prometheus/data
              +  promtail:
              +    command:
              +    - --config.file=/etc/promtail/config.yml
              +    container_name: promtail
              +    image: grafana/promtail:2.0.0
              +    ports:
              +    - 1514:1514
              +    - 9080:9080
              +    volumes:
              +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
              +version: '3'
              +
              +
              +
              +

              Start and Stop

              +

              To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/index.html b/branch-3.7/install/index.html new file mode 100644 index 000000000..39ca127c2 --- /dev/null +++ b/branch-3.7/install/index.html @@ -0,0 +1,648 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Download and Install Scylla Monitoring Stack

              +
              +
              +

              Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

              +

              Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/min-prod-hw.html b/branch-3.7/install/min-prod-hw.html new file mode 100644 index 000000000..08f4552e3 --- /dev/null +++ b/branch-3.7/install/min-prod-hw.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Minimal Production System Recommendations

              +
                +
              • CPU - at least 2 physical cores/ 4vCPUs

              • +
              • Memory - 15GB+ DRAM

              • +
              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

              • +
              • Network - 1GbE/10GbE preferred

              • +
              +
              +

              Calculating Prometheus Minimal Disk Space requirement

              +

              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

              +

              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

              +

              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

              +
              6 * 16 * 200MB ~ 20GB
              +
              +
              +

              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/monitor_without_docker.html b/branch-3.7/install/monitor_without_docker.html new file mode 100644 index 000000000..ca04dccf1 --- /dev/null +++ b/branch-3.7/install/monitor_without_docker.html @@ -0,0 +1,985 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Deploying Scylla Monitoring Stack Without Docker

              +

              The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

              +

              Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

              +
              +

              Minimal Production System Recommendations

              +
                +
              • CPU - at least 2 physical cores/ 4vCPUs

              • +
              • Memory - 15GB+ DRAM

              • +
              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

              • +
              • Network - 1GbE/10GbE preferred

              • +
              +
              +

              Calculating Prometheus Minimal Disk Space requirement

              +

              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

              +

              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

              +

              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

              +
              6 * 16 * 200MB ~ 20GB
              +
              +
              +

              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

              +

              The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

              +
              +

              Note

              +

              Confirm before beginning that your Grafana and Prometheus versions are supported by the Monitoring Stack version you want to install. See the Scylla Monitoring Stack Compatibility Matrix.

              +
              +
              +
              +
              +

              Install Scylla Monitoring Stack

              +

              The following procedure uses a CentOS 7 based instance

              +
                +
              1. Download the latest Scylla Monitoring Stack release.

              2. +
              +

              wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.5.tar.gz

              +
                +
              1. Open the tar

              2. +
              +

              tar -xvf scylla-monitoring-3.5.tar.gz

              +
              +
              +

              Install Alertmanager

              +

              Tested with alertmanager 0.20.0 version

              +
                +
              1. Install alertmanager

              2. +
              +
              wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz
              +tar -xvf alertmanager-0.20.0.linux-amd64.tar.gz
              +
              +
              +
                +
              1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to alertmanager.yml in the alertmanager installation directory.

              2. +
              +

              For example:

              +
              cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.5/prometheus/rule_config.yml /home/centos/alertmanager-0.20.0.linux-amd64/alertmanager.yml
              +
              +
              +
                +
              1. Start the Alertmanager

              2. +
              +

              For example:

              +
              cd alertmanager-0.20.0.linux-amd64
              +./alertmanager
              +
              +
              +
                +
              1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

              2. +
              +

              For example:

              +
              http://192.168.135.166:9093/
              +
              +
              +../_images/alertmanager.png +
              +
              +

              Install Prometheus

              +

              Tested with Prometheus version 2.18.1

              +
                +
              1. Install Prometheus

              2. +
              +
              wget https://github.com/prometheus/prometheus/releases/download/v2.18.1/prometheus-2.18.1.linux-amd64.tar.gz
              +tar -xvf prometheus-2.18.1.linux-amd64.tar.gz
              +
              +
              +
                +
              1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to Prometheus installation directory.

              2. +
              +

              Copy prometheus/prometheus.yml.template to prometheus.yml

              +

              For example:

              +
              cp scylla-monitoring-scylla-monitoring-3.5/prometheus/*.yml prometheus-2.18.1.linux-amd64
              +cp scylla-monitoring-scylla-monitoring-3.5/prometheus/prometheus.yml.template prometheus-2.18.1.linux-amd64/prometheus.yml
              +
              +
              +
                +
              1. Edit the prometheus.yml file to point to the correct static data sources.

              2. +
              +
              +

              Note

              +

              Make sure to include the honor_labels: false parameter in the prometheus.yml file.

              +
              +
              vi prometheus-2.18.1.linux-amd64/prometheus.yml
              +
              +
              +

              Set the alertmanger address and port by replacing AM_ADDRESS in the file.

              +

              For example if the alertmanager will run on the same host:

              +
              alerting:
              +   alertmanagers:
              +   - static_configs:
              +       - targets:
              +           - 127.0.0.1:9093
              +
              +
              +

              Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

              +

              For example the scrape config for Scylla:

              +
              global:
              +  scrape_interval: 5s # By default, scrape targets every 5 second.
              +  scrape_timeout: 4s # Timeout before trying to scape a target again
              +
              +  # Attach these labels to any time series or alerts when communicating with
              +  # external systems (federation, remote storage, Alertmanager).
              +  external_labels:
              +    monitor: 'scylla-monitor'
              +
              +scrape_configs:
              +- job_name: scylla
              +  honor_labels: false
              +  file_sd_configs:
              +    - files:
              +      - scylla_servers.yml
              +  relabel_configs:
              +    - source_labels: [__address__]
              +      regex:  '([^:]+)'
              +      target_label: __address__
              +      replacement: '${1}:9180'
              +
              +    - source_labels: [__address__]
              +      regex:  '(.*):.+'
              +      target_label: instance
              +      replacement: '${1}'
              +
              +
              +
                +
              1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

              2. +
              +
              +

              Note

              +

              There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

              +
              +

              An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

              +
              +

              Note

              +

              You must have both files even if you are not using Scylla Manager

              +
              +

              Add the labels for the cluster and data-center

              +

              scylla_servers.yml:

              +

              For example:

              +
              cat scylla_servers.yml
              +# List Scylla end points
              +
              +- targets:
              +  - 192.168.66.6
              +  - 192.168.66.244
              +  labels:
              +    cluster: cluster1
              +    dc: dc1
              +- targets:
              +    - 172.17.0.3
              +  labels:
              +    cluster: cluster1
              +    dc: dc2
              +
              +
              +
              +

              Note

              +

              See the previous note about deprecating the node_exporter_servers.yml file.

              +
              +

              scylla_manager_server.yml

              +

              For example:

              +
              - targets:
              +  - 127.0.0.1:56090
              +
              +
              +
                +
              1. Create a data directory for Prometheus to store the metrics data

              2. +
              +

              For example:

              +
              mkdir prometheus-2.18.1.linux-amd64/mydata
              +
              +
              +
                +
              1. Start Prometheus server:

              2. +
              +

              For example:

              +
              cd prometheus-2.18.1.linux-amd64
              +./prometheus --config.file=prometheus.yml --storage.tsdb.path mydata
              +
              +
              +

              Data should start accumulate on: ./mydata

              +
                +
              1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

              2. +
              +

              For example:

              +
              http://192.168.135.166:9090/
              +
              +
              +../_images/1.png +

              Prometheus console should be visible

              +
                +
              1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

              2. +
              +

              For example:

              +

              node_memory_MemFree

              +../_images/2.png +

              And

              +

              scylla_reactor_utilization

              +../_images/3.png +

              At this point Scylla is emitting the metrics and Prometheus is able to store them.

              +
              +
              +

              Install Grafana

              +

              Tested with Grafna 6.7.3

              +
                +
              1. Install Grafana based on the instructions here make sure to use version 6.7.0 or higher

              2. +
              +

              Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

              +
                +
              1. Access Scylla-Grafana-monitoring directory

              2. +
              +

              cd scylla-monitoring-scylla-monitoring-3.5/

              +
                +
              1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

              2. +
              +
              sudo cp -r grafana/plugins /var/lib/grafana/
              +
              +
              +

              If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

              +

              For example:

              +
              cp -r grafana/plugins ../grafana-6.7.3/public/app
              +
              +
              +
                +
              1. Provision the Dashboard them

              2. +
              +

              For example Scylla version 4.0 and Scylla manager version 2.0

              +

              For Grafana installed with yum install

              +
              sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
              +sudo mkdir -p /var/lib/grafana/dashboards
              +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
              +
              +
              +

              For Grafana installed from packages

              +
              cp -p -r grafana/build/* ../grafana-6.7.3/public/build/
              +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.4.0.yaml
              +cp -p grafana/load.yaml ../grafana-6.7.3/conf/provisioning/dashboards/load.manager_2.0.yaml
              +
              +
              +

              Edit the load.* files in /home/centos/grafana-6.7.3/conf/provisioning/dashboards/ for the correct path, +for example load.4.0.yaml would point to: /home/centos/grafana-6.7.3/public/build/ver_4.0 and the FOLDER will be 4.0

              +
                +
              1. Set the data source by copy datasource.yml and edit it

              2. +
              +
              sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
              +
              +
              +

              For Grafana installed from packages

              +
              cp -p grafana/datasource.yml /home/centos/grafana-6.7.3/conf/provisioning/datasources/
              +
              +
              +

              You should set the Prometheus and the alertmanager IP and port.

              +

              For example

              +
              sudo cat /etc/grafana/provisioning/datasources/datasource.yml
              +apiVersion: 1
              +datasources:
              + - name: prometheus
              +   type: prometheus
              +   url: http://192.168.135.167:9090
              +   access: proxy
              +   basicAuth: false
              +
              + - name: alertmanager
              +   type: camptocamp-prometheus-alertmanager-datasource
              +   orgId: 1
              +   typeLogoUrl: public/img/icn-datasource.svg
              +   access: proxy
              +   url: http://192.168.135.166:9093
              +   password:
              +   user:
              +   database:
              +   basicAuth:
              +   isDefault:
              +   jsonData:
              +     severity_critical: '4'
              +     severity_high: '3'
              +     severity_warning: '2'
              +     severity_info: '1'
              +
              +
              +
                +
              1. Start the Grafana service

              2. +
              +

              For Grafana installed with yum install

              +

              sudo service grafana-server start

              +

              For Grafana installed from packages:

              +

              cp -p /home/centos/grafana-6.7.3/conf/sample.ini /home/centos/grafana-6.7.3/conf/scylla.ini

              +

              Edit scylla.ini to reflect the right paths in the paths section of the file.

              +
              plugins = /home/centos/grafana-6.7.3/data/plugins
              +provisioning = /home/centos/grafana-6.7.3/conf/provisioning
              +
              +
              +

              Start the server:

              +
              cd /home/centos/grafana-6.7.3/
              +./bin/grafana-server -config /home/centos/grafana-6.7.3/conf/scylla.ini
              +
              +
              +
                +
              1. Make sure Grafana is running

              2. +
              +

              Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

              +../_images/grafana.png +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/monitoring_stack.html b/branch-3.7/install/monitoring_stack.html new file mode 100644 index 000000000..0faa48126 --- /dev/null +++ b/branch-3.7/install/monitoring_stack.html @@ -0,0 +1,1013 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Install Scylla Monitoring Stack

              + +

              This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

              +

              The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

              +

              For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

              +
              +

              Minimal Production System Recommendations

              +
                +
              • CPU - at least 2 physical cores/ 4vCPUs

              • +
              • Memory - 15GB+ DRAM

              • +
              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

              • +
              • Network - 1GbE/10GbE preferred

              • +
              +
              +

              Calculating Prometheus Minimal Disk Space requirement

              +

              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

              +

              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

              +

              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

              +
              6 * 16 * 200MB ~ 20GB
              +
              +
              +

              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

              +
              +
              +
              +

              Prerequisites

              +
                +
              • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

              • +
              • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

              • +
              + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + +
              Scylla Monitoring Stack Compatibility Matrix

              Scylla Monitoring Stack Version

              Prometheus Version

              Grafana Version

              3.7

              2.25.2

              7.4.0

              3.6

              2.18.1

              7.3.5

              3.5

              2.18.1

              7.1.5

              3.4

              2.18.1

              6.7.3

              +
              +
              +

              Docker Post Installation

              +

              Docker post installation guide can be found here

              +
              +

              Note

              +

              Avoid running the container as root.

              +
              +

              To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

              +
                +
              1. Create the Docker group.

              2. +
              +
              sudo groupadd docker
              +
              +
              +
                +
              1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

              2. +
              +
              sudo usermod -aG docker $USER
              +
              +
              +
                +
              1. Start Docker by calling:

              2. +
              +
              sudo systemctl enable docker
              +
              +
              +
              +
              +

              Install Scylla Monitoring Stack

              +

              Procedure

              +
                +
              1. Download and extract the latest Scylla Monitoring Stack binary;.

              2. +
              +
              wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.7.0.tar.gz
              +tar -xvf scylla-monitoring-3.7.0.tar.gz
              +cd scylla-monitoring-scylla-monitoring-3.7.0
              +
              +
              +

              As an alternative, you can clone and use the Git repository directly.

              +
              git clone https://github.com/scylladb/scylla-monitoring.git
              +cd scylla-monitoring
              +git checkout branch-3.7
              +
              +
              +
                +
              1. Start Docker service if needed

              2. +
              +
              sudo systemctl restart docker
              +
              +
              +
              +
              +

              Configure Scylla Monitoring Stack

              +

              To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

              +

              This configuration can be done from files, or using the Consul api.

              +

              Scylla Manager 2.0 and higher supports the Consul API.

              +
              +

              Configure Scylla nodes from files

              +
                +
              1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

              2. +
              +
              +

              Note

              +

              It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

              +
              +

              For example:

              +
              - targets:
              +      - 172.17.0.2
              +      - 172.17.0.3
              +  labels:
              +      cluster: cluster1
              +      dc: dc1
              +
              +
              +
              +

              Note

              +

              If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

              +
              +

              Using IPV6

              +

              To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

              +

              For example:

              +
              - targets:
              +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
              +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
              +  labels:
              +      cluster: cluster1
              +      dc: dc1
              +
              +
              +
              +

              Note

              +

              For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

              +
              +

              For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

              +
              +

              Note

              +

              By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

              +
              +

              If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

              +

              For example:

              +
              ./start-all.sh -s my_scylla_server.yml -d prometheus_data
              +
              +
              +

              Mark the different Data Centers with Labels.

              +

              As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

              +

              You can use the genconfig.py script to generate the server file. For example:

              +
              ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
              +
              +
              +

              This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

              +

              OR

              +

              The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

              +
              nodetool status | ./genconfig.py -NS
              +
              +
              +

              2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

              +

              You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

              +

              For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

              +
              # List Scylla Manager end points
              +
              +- targets:
              +  - 172.17.0.7:5090
              +
              +
              +

              Note that you do not need to add labels to the Scylla Manager targets.

              +
              +
              +

              Configure Scylla nodes using Scylla-Manager Consul API

              +

              Scylla Manager 2.0 has a Consul like API.

              +

              When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

              +

              For example:

              +
              ./start-all.sh -L 10.10.0.1
              +
              +
              +
              +

              Note

              +

              If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

              +
              +
              +
              +

              Connecting Scylla-Monitoring to Scylla

              +

              Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

              +

              You can limit the user to read only, currently it only read table from the system keyspace.

              +

              To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

              +

              Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

              +
              +
              +

              Use an external directory for the Prometheus data directory

              +

              The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

              +
              +

              Note

              +

              Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

              +
              +

              If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

              +

              In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

              +
              +
              +

              Add Additional Prometheus Targets

              +

              There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

              +

              The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

              +

              You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

              +
              - job_name: 'myservice'
              +  # Override the global default and scrape targets from this job every 5 seconds.
              +  scrape_interval: 5s
              +  static_configs:
              +    - targets:
              +      - 17.0.0.1:7000
              +
              +
              +
              +
              +
              +

              Start and Stop Scylla Monitoring Stack

              +
              +

              Start

              +
              ./start-all.sh -d prometheus_data
              +
              +
              +
              +
              +

              Stop

              +
              ./kill-all.sh
              +
              +
              +
              +
              +

              Start a Specific Scylla Monitoring Stack Version

              +

              By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

              +

              You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

              +

              Multiple versions are supported. For example:

              +
              ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
              +
              +
              +

              will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

              +
              +
              +

              Accessing the localhost

              +

              The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

              +
              ./start-all.sh -l -d prometheus-data
              +
              +
              +
              +
              +

              Configure rsyslog on each Scylla node

              +

              generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

              +

              Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

              +

              Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

              +

              If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

              +
              if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
              +
              +
              +

              Restart rsyslog for the configuration to take effect.

              +
              systemctl restart rsyslog
              +
              +
              +
              +
              +
              +

              View Grafana Dashboards

              +

              Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/start_all.html b/branch-3.7/install/start_all.html new file mode 100644 index 000000000..712d2ac6d --- /dev/null +++ b/branch-3.7/install/start_all.html @@ -0,0 +1,729 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              The start-all.sh command

              +

              Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

              +

              The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

              +
              +

              General Options

              +

              -h Help, Print the help, and exit.

              +

              –version print the current Scylla-Monitoring stack version, and exit.

              +

              -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

              +

              -A bind-to-ip-address Bind the listening-address to an explicit IP address.

              +

              -D encapsulate docker param Allows passing additional parameters to all the docker containers.

              +

              –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

              +
              + + +
              +

              Alert Manager

              +

              alertmanager handles the alerts and takes the following parameters:

              +

              -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

              +

              -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

              +

              -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/install/thanos.html b/branch-3.7/install/thanos.html new file mode 100644 index 000000000..b1059192a --- /dev/null +++ b/branch-3.7/install/thanos.html @@ -0,0 +1,732 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Using Thanos as Data Source With Scylla Monitoring Stack

              +

              Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as:

              +
                +
              • High-availability.

              • +
              • Horizontal scaling.

              • +
              • Backup.

              • +
              +

              The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

              +

              The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

              +
              +

              Using Thanos As a Prometheus Aggregator

              +

              There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

              +
              +

              Prometheus Configuration

              +

              We will assume you have two Prometheus servers running.

              +
                +
              1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

              2. +
              3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

              4. +
              +
              +
              +

              Thanos sidecar

              +

              The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

              +
              docker run -d \
              + -v /path/to/prom/dir:/data/prom:z \
              + -i --name sidecar thanosio/thanos \
              + sidecar \
              + --grpc-address=0.0.0.0:10911 \
              + --grpc-grace-period=1s \
              + --http-address=0.0.0.0:10912 \
              + --http-grace-period=1s \
              + --prometheus.url=http://prometheus-ip:9090 \
              + --tsdb.path=/data/prom \
              + -p 10912:10912 \
              + -p 10911:10911
              +
              +
              +

              After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

              +
              +
              +

              Thanos query

              +

              Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

              +
              docker run -d \
              + --name thanos -- thanosio/thanos \
              +   query \
              +   --debug.name=query0 \
              +   --log.level=debug \
              +   --grpc-address=0.0.0.0:10903 \
              +   --grpc-grace-period=1s \
              +   --http-address=0.0.0.0:10904 \
              +   --http-grace-period=1s \
              +   --query.replica-label=prometheus \
              +   --store={ip1}:10911 --store={ip2}:10911
              +
              +
              +

              After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

              +
              +
              +

              Update Scylla Data source

              +

              The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

              +

              The file you edit is a template file that replaces the file Grafana uses, next time you start.

              +

              Restart the Scylla Monitoring Stack it should now use Thanos.

              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/objects.inv b/branch-3.7/objects.inv new file mode 100644 index 000000000..e511733e8 Binary files /dev/null and b/branch-3.7/objects.inv differ diff --git a/branch-3.7/procedures/alerts/alerting.html b/branch-3.7/procedures/alerts/alerting.html new file mode 100644 index 000000000..4c0580765 --- /dev/null +++ b/branch-3.7/procedures/alerts/alerting.html @@ -0,0 +1,728 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Alerting

              +

              Alerts are a Prometheus enhancement to notify that something is wrong in the system.

              +

              You can read more about Prometheus alerting here

              +

              By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

              +

              In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

              +

              The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

              +../../_images/monitoring_stack.png +
              +

              Prometheus Alerts

              +

              The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

              +

              Each alert consists of:

              +
                +
              • Name

              • +
              • What happened

              • +
              • For how long

              • +
              • What to report

              • +
              +

              For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

              +
              - alert: InstanceDown
              +  expr: up == 0
              +  for: 60s
              +  labels:
              +    severity: "2"
              +  annotations:
              +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
              +    summary: Instance {{ $labels.instance }} down
              +
              +
              +

              The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

              +

              The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

              +

              The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

              +

              annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

              +
              +
              +

              Alertmanager

              +

              The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

              +

              The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

              +
                +
              • Routes: Represent a routing tree, the most specific rule, wins

              • +
              • Inhibition: Mute an alert, based on another alert

              • +
              • Receiver: Send a notification via email, sluck, etc’

              • +
              +

              Check the Alertmanager documentation for details on how to specify a specific receiver.

              +

              In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

              +
              +
              +

              Tips When Adding an Alert

              +

              It’s worse having an alert that does not work, than not having an alert at all

              +

              There are multiple ways you can use to make sure your alert is set correctly:

              +
                +
              • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

              • +
              • Force the alert to be active by reducing the limits or the duration.

              • +
              • When possible simulate the actual scenario and see that the alert works as expected.

              • +
              +

              For example, low available disk space.

              +

              Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

              +

              Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

              +

              Starting with a simple working expression helps you bisect problems.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/procedures/alerts/index.html b/branch-3.7/procedures/alerts/index.html new file mode 100644 index 000000000..20feb7ad8 --- /dev/null +++ b/branch-3.7/procedures/alerts/index.html @@ -0,0 +1,650 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Alert Manager

              +
              +
              +

              Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/procedures/index.html b/branch-3.7/procedures/index.html new file mode 100644 index 000000000..75e885b46 --- /dev/null +++ b/branch-3.7/procedures/index.html @@ -0,0 +1,645 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Procedures

              +
              +
              +

              There are several reference guides available which give additional information. Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/procedures/updating_dashboard.html b/branch-3.7/procedures/updating_dashboard.html new file mode 100644 index 000000000..f67cb1458 --- /dev/null +++ b/branch-3.7/procedures/updating_dashboard.html @@ -0,0 +1,938 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Adding and Modifying Dashboards

              +

              The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

              +

              It will explain about Scylla Monitoring Stack dashboard templates and how to modify them.

              + +
              +

              General Limitations

              +

              Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

              +
              +

              consistency between restarts

              +

              By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

              +
              +
              +

              consistency between upgrades

              +

              As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

              +
              +

              Note

              +

               You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

              +
              +

              At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

              +
              +
              +
              +

              Using templated Dashboards

              +

              Why does Scylla Monitor use dashboard templates?

              +

              We found the Grafana dashboards Json format too verbose to be maintainable.

              +

              Each element in the dashboard file (Each Json object) contains all of its attributes and values.

              +

              For example a typical graph panel would look like:

              +
              {
              +    "aliasColors": {},
              +    "bars": false,
              +    "datasource": "prometheus",
              +    "editable": true,
              +    "error": false,
              +    "fill": 0,
              +    "grid": {
              +        "threshold1": null,
              +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
              +        "threshold2": null,
              +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
              +    },
              +    "gridPos": {
              +        "h": 6,
              +        "w": 10,
              +        "x": 0,
              +        "y": 4
              +    },
              +    "id": 2,
              +    "isNew": true,
              +    "legend": {
              +        "avg": false,
              +        "current": false,
              +        "max": false,
              +        "min": false,
              +        "show": false,
              +        "total": false,
              +        "values": false
              +    },
              +    "lines": true,
              +    "linewidth": 2,
              +    "links": [],
              +    "nullPointMode": "connected",
              +    "percentage": false,
              +    "pointradius": 5,
              +    "points": false,
              +    "renderer": "flot",
              +    "seriesOverrides": [
              +        {}
              +    ],
              +    "span": 5,
              +    "stack": false,
              +    "steppedLine": false,
              +    "targets": [
              +        {
              +            "expr": "sum(node_filesystem_avail) by (instance)",
              +            "intervalFactor": 1,
              +            "legendFormat": "",
              +            "refId": "A",
              +            "step": 1
              +        }
              +    ],
              +    "timeFrom": null,
              +    "timeShift": null,
              +    "title": "Available Disk Size",
              +    "tooltip": {
              +        "msResolution": false,
              +        "shared": true,
              +        "sort": 0,
              +        "value_type": "cumulative"
              +    },
              +    "transparent": false,
              +    "type": "graph",
              +    "xaxis": {
              +        "show": true
              +    },
              +    "yaxes": [
              +        {
              +            "format": "percent",
              +            "logBase": 1,
              +            "max": 101,
              +            "min": 0,
              +            "show": true
              +        },
              +        {
              +            "format": "short",
              +            "logBase": 1,
              +            "max": null,
              +            "min": null,
              +            "show": true
              +        }
              +    ]
              +}
              +
              +
              +

              As you can imagine, most panels would have similar values.

              +

              To reduce the redundancy of Grafana JSON format, we added dashboard templates.

              +
              +

              The template class system

              +

              Scylla Monitoring Stack dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

              +

              The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

              +

              In the template file, you can also add or override attributes.

              +

              The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

              +

              When generating dashboards, each class will be replaced by its definition.

              +

              For example row in the type.json defined

              +
              {
              + "base_row": {
              +     "collapse": false,
              +     "editable": true
              + },
              + "row": {
              +     "class": "base_row",
              +     "height": "250px"
              + }
              + }
              +
              +
              +

              In a Template it will be used like

              +
              {
              +     "class": "row",
              +     "height": "150px",
              +     "panels": [
              +     ]
              +}
              +
              +
              +

              The output will be

              +
              {
              +     "class": "row",
              +     "collapse": false,
              +     "editable": true,
              +     "height": "150px",
              +     "panels": [
              +
              +     ]
              +}
              +
              +
              +

              We can see that the template added the panels attribute and override the height attribute.

              +
              +
              +

              Panel example

              +

              Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

              +
              {
              +     "class": "row",
              +     "panels": [
              +         {
              +             "class": "bytes_panel",
              +             "span": 3,
              +             "targets": [
              +                 {
              +                     "expr": "sum(node_filesystem_avail) by (instance)",
              +                     "intervalFactor": 1,
              +                     "legendFormat": "",
              +                     "metric": "",
              +                     "refId": "A",
              +                     "step": 1
              +                 }
              +             ],
              +             "title": "Available Disk Size"
              +         }
              +     ]
              +}
              +
              +
              +

              In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

              +

              You can also see that we override the span attribute to set the panel size.

              +

              To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

              +
              +
              +

              Grafana Formats and Layouts

              +

              The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

              +

              Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

              +

              The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

              +

              To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

              +

              The panel’s height will be taken from their row. The span attribute is still supported as is row height.

              +

              you can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

              +

              gridPos has the following attributes:

              +
              {
              +   "x": 0,
              +   "y": 0,
              +   "w": 24,
              +   "h": 4
              + }
              +
              +
              +

              When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

              +
              {
              +   "gridPos": {
              +      "h": 2
              +    }
              +}
              +
              +
              +
              +
              +

              Generating the dashboards from templates (generate-dashboards.sh)

              +
              +

              Prerequisite

              +

              Python 2.7

              +

              make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

              +

              Use the -h flag to get help information.

              +

              You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

              +

              When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

              +

              For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

              +

              .\generate-dashboards.sh -v 2020.1

              +
              +

              Note

              +

              generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

              +
              +
              +
              +
              +

              Validation

              +

              After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

              +

              Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/reference/index.html b/branch-3.7/reference/index.html new file mode 100644 index 000000000..9b90d04b5 --- /dev/null +++ b/branch-3.7/reference/index.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Reference Guide

              +
              +
              +

              There are several reference guides available which give additional information. Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/reference/matrix.html b/branch-3.7/reference/matrix.html new file mode 100644 index 000000000..bc64b1a0d --- /dev/null +++ b/branch-3.7/reference/matrix.html @@ -0,0 +1,761 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Support Matrix

              +

              The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

              + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

              Scylla Monitoring Stack Version

              Scylla Open Source Version

              Scylla Enterprise Version

              Node_exporter[1] Version

              Scylla Manager Version

              3.7

              4.2, 4.3, 4.4

              2019.1, 2020.1, 2021.1

              0.17

              2.2, 2.3

              3.6.3

              4.2, 4.3, 4.4

              2019.1, 2020.1, 2021.1

              0.17

              2.2, 2.3, 2.1

              3.6

              4.1, 4.2, 4.3

              2019.1, 2020.1

              0.17

              2.1, 2.2, 2.3

              3.6.1

              4.1, 4.2, 4.3

              2019.1, 2020.1

              0.17

              2.1, 2.2

              3.6.1

              4.1, 4.2, 4.3, 4.4

              2019.1, 2020.1

              0.17

              2.1, 2.2

              3.5

              3.3, 4.0, 4.1, 4.2

              2019.1, 2020.1

              0.17

              2.0, 2.1, 2.2

              3.4.3

              3.3, 4.0, 4.1, 4.2

              2019.1, 2020.1

              0.17

              2.0, 2.1

              3.4

              3.3, 4.0, 4.1

              2018.1, 2019.1

              0.17

              2.0, 2.1

              3.3

              3.1, 3.2, 3.3, 4.0

              2018.1, 2019.1

              0.17

              1.4, 2.0, 2.1

              3.2

              3.1, 3.2, 3.3

              2018.1, 2019.1

              0.17

              1.4, 2.0

              3.1

              2.3, 3.0, 3.1, 3.2

              2018.1, 2019.1

              0.17

              1.3, 1.4, 2.0

              3.0

              2.3, 3.0, 3.1, 3.2

              2018.1, 2019.1

              0.17

              1.3, 1.4

              2.4

              2.3, 3.0, 3.1

              2018.1, 2019.1

              0.14, 0.17

              1.3, 1.4

              2.3

              2.3, 3.0

              2018.1, 2019.1

              0.14, 0.17

              1.3

              2.2

              2.3, 3.0

              2018.1, 2019.1

              0.14, 0.17

              1.3

              2.1

              2.3, 3.0

              2018.1

              0.14, 0.17

              1.3

              +

              [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/reference/monitoring_apis.html b/branch-3.7/reference/monitoring_apis.html new file mode 100644 index 000000000..36c0f79fa --- /dev/null +++ b/branch-3.7/reference/monitoring_apis.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Interfaces

              +

              Scylla exposes two interfaces for online monitoring, as described below

              +
              +

              Prometheus

              +

              By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

              +

              For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

              +

              You can change the Prometheus listening address and port in scylla.yaml file

              +
              # prometheus port
              +# By default, Scylla opens prometheus API port on port 9180
              +# setting the port to 0 will disable the prometheus API.
              +prometheus_port: 9180
              +#
              +# prometheus address
              +# By default, Scylla binds all interfaces to the prometheus API
              +# It is possible to restrict the listening address to a specific one
              +prometheus_address: 0.0.0.0
              +
              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/robots.txt b/branch-3.7/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.7/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.7/search.html b/branch-3.7/search.html new file mode 100644 index 000000000..cd94005fe --- /dev/null +++ b/branch-3.7/search.html @@ -0,0 +1,622 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + + + +
              + + + + + +
              + + +
              + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/searchindex.js b/branch-3.7/searchindex.js new file mode 100644 index 000000000..3dd8b4b47 --- /dev/null +++ b/branch-3.7/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], "7": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], "scylla": [0, 2, 4, 7, 9, 12, 18, 19, 21, 22, 24, 29, 30], "monitor": [0, 2, 4, 7, 9, 12, 30], "stack": [0, 2, 7, 12, 30], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 17, 18, 19, 20, 21, 24, 25, 26, 28, 30], "full": [0, 1, 3, 6, 9, 18], "alert": [0, 1, 3, 5, 6, 11], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 14, 17, 26, 28], "contain": [0, 1, 2, 3, 6, 7, 8, 12, 21, 30], "open": [0, 1, 3, 5, 6, 14, 15], "sourc": [0, 1, 3, 5, 6, 9, 14], "tool": [0, 1, 3, 17, 30], "includ": [0, 1, 3, 5], "prometheu": [0, 1, 3, 10, 12, 14, 17, 30], "grafana": [0, 1, 3, 8, 9], "well": [0, 1, 3, 6], "custom": [0, 1, 3], "dashboard": [0, 1, 3, 5, 7, 9, 11, 14, 17, 25, 30, 31], "consist": [1, 9, 25], "three": [1, 6, 9], "compon": 1, "wrap": 1, "docker": [1, 3, 7, 8, 17], "collect": [1, 6, 7, 8, 26, 28], "store": [1, 5, 8, 12, 19, 20], "metric": [1, 4, 5, 6, 7, 8, 9, 12, 14, 30], "alertmanag": [1, 2, 7], "handl": [1, 6, 7], "server": [1, 2, 5, 6, 7, 8, 9, 12, 15, 18, 30], "choos": [1, 3, 10, 11, 13, 16, 17, 31], "topic": [1, 3, 10, 11, 13, 16, 20, 31], "get": [1, 6, 8, 9, 12, 19, 25, 29, 30], "start": [1, 3, 5, 8, 9, 12], "user": [1, 2, 5, 6, 7, 18, 30], "guid": [1, 6, 11, 17], "download": [1, 5, 6], "instal": [1, 2, 17], "procedur": [1, 5, 6, 17], "troubleshoot": [1, 24], "refer": [1, 6, 11], "lesson": [1, 20, 21], "univers": 1, "For": [1, 2, 4, 5, 6, 7, 9, 12, 15, 17, 25, 26, 29, 30], "older": 1, "version": [1, 2, 5, 7, 12, 14, 17], "document": [1, 6, 8, 9, 12, 17], "see": [1, 2, 4, 5, 6, 9, 12, 15, 17, 30], "here": [1, 5, 6, 7, 9, 12], "base": [2, 5, 6, 7, 8, 9, 12, 18, 30], "you": [2, 4, 5, 6, 7, 8, 9, 10, 12, 15, 17, 21, 23, 25, 30, 31], "can": [2, 5, 6, 7, 8, 9, 12, 15, 17, 18, 21, 25, 30, 31], "all": [2, 3, 6, 8, 9, 12, 15, 17, 18, 22, 25, 30], "sh": [2, 3, 6, 17], "kill": [2, 6, 17], "script": [2, 3, 6, 7, 12], "an": [2, 4, 5, 7, 8, 12, 17, 23, 24, 25, 26, 28, 30], "altern": [2, 6], "method": [2, 6], "It": [2, 6, 7, 9, 12, 15], "requir": [2, 8, 19, 22, 26, 30], "more": [2, 6, 9, 12, 15, 17, 18, 21, 24, 26, 29, 30], "manual": [2, 17], "step": [2, 5, 8, 12, 17], "onc": [2, 23, 30], "configur": [2, 5, 7, 9, 12, 15, 17, 25], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 17, 25, 26, 27, 30, 31], "two": [2, 6, 7, 8, 15, 25, 30], "wai": [2, 7, 9, 17, 24, 30], "launch": 2, "should": [2, 5, 6, 8, 12, 17, 18, 19, 22, 23, 24, 29, 30], "one": [2, 6, 7, 15, 19, 21, 22, 25, 26, 30], "both": [2, 5, 6, 17, 30], "In": [2, 6, 9, 12, 17, 30], "particular": 2, "creat": [2, 5, 6, 7, 9, 12, 17, 18, 30], "updat": [2, 5, 12, 17], "yml": [2, 5, 6, 7, 8, 9, 17, 30], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 17, 20, 25, 26, 30], "make": [2, 5, 6, 7, 8, 9, 12, 17, 25, 30], "sure": [2, 5, 6, 8, 9, 12, 17, 30], "have": [2, 4, 5, 6, 7, 8, 9, 12, 17], "among": [2, 25], "other": [2, 8, 9], "ip": [2, 5, 6, 7, 8, 15, 17], "address": [2, 5, 6, 7, 8, 15, 17], "either": [2, 6], "locat": [2, 7, 9, 25], "scylla_serv": [2, 5, 6, 17, 30], "consul": [2, 7], "manag": [2, 5, 11, 14, 16], "config": [2, 5, 7], "gener": [2, 6, 9, 30], "exampl": [2, 4, 5, 6, 7, 8, 9, 17, 25, 26, 30], "product": [2, 7], "system": [2, 7, 9, 10, 19, 25, 30], "advis": [2, 25], "extern": [2, 5, 7, 8, 9, 12, 17, 30], "directori": [2, 5, 7, 8, 9, 12], "databas": [2, 5, 7, 21, 30], "accordingli": 2, "below": [2, 6, 9, 15], "read": [2, 6, 8, 9, 17, 18, 22], "its": [2, 6, 7, 8, 12], "from": [2, 5, 7, 8, 9, 17, 18, 24, 27, 30], "note": [2, 5, 6, 7, 17], "latter": 2, "tell": 2, "where": [2, 5, 6, 12, 17, 30], "themselv": [2, 12], "which": [2, 8, 11, 12, 13, 14, 24, 26, 28, 30], "differ": [2, 5, 6, 7, 8, 12, 23, 24, 30], "run": [2, 3, 5, 6, 7, 8, 12, 14, 17], "follow": [2, 4, 5, 6, 7, 12, 14, 17, 30], "command": [2, 6, 8, 17], "datasourc": [2, 5, 6, 8, 12], "under": [2, 5, 6], "yaml": [2, 5, 6, 15], "To": [2, 4, 5, 6, 12, 15], "sashboard": 2, "t": [2, 12], "line": [2, 6, 7, 8, 12], "flag": [2, 6, 7, 8, 12, 17], "v": [2, 6, 7, 8, 12, 17], "specifi": [2, 6, 7, 9, 12, 17], "enterpris": [2, 6, 12, 14], "2020": [2, 6, 12, 14], "1": [2, 5, 6, 7, 8, 12, 14], "thi": [2, 4, 5, 6, 7, 8, 9, 12, 17, 18, 19, 22, 25, 27, 30], "your": [2, 5, 6, 7, 8, 9, 10, 12, 15, 17, 19, 20, 21, 30], "pass": [2, 6, 7], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 17], "container_nam": 2, "aalert": 2, "imag": [2, 17], "prom": [2, 8, 17], "v0": [2, 5], "21": 2, "port": [2, 5, 6, 7, 15, 17], "9093": [2, 5], "volum": [2, 4, 5, 6], "rule_config": [2, 5, 7, 9], "etc": [2, 5, 6, 7, 9, 12], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 12], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 20, 21, 22, 24, 26, 28, 29], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 12], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "5": [2, 4, 5, 6, 12, 14, 17], "3000": [2, 5, 6], "1000": 2, "build": [2, 5], "plugin": [2, 5], "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 20, 26, 28, 30], "path": [2, 5, 6, 7, 8, 9], "dir": [2, 7, 8], "loki": [2, 6], "mnt": 2, "2": [2, 4, 5, 6, 7, 9, 12, 14, 26], "3100": 2, "rule": [2, 5, 7, 9, 23], "conf": [2, 5, 6], "promotheu": 2, "aprom": [2, 17], "v2": [2, 5], "18": [2, 5, 6], "9090": [2, 5, 8, 17], "d": [2, 6, 7, 8], "scylla_manager_serv": [2, 5, 6, 17], "node_exporter_serv": [2, 5, 6], "promtail": 2, "1514": [2, 6], "9080": 2, "promtail_config": 2, "up": [2, 5, 9, 17, 30], "down": [2, 9, 17, 19, 26], "begin": [3, 5, 10, 11, 13, 16, 31], "deploi": [3, 6], "without": [3, 6, 7, 12], "us": [3, 4, 5, 7, 9, 10, 17, 21, 25, 26, 28, 30], "compos": 3, "thano": 3, "cpu": [4, 5, 6], "least": [4, 5, 6], "physic": [4, 5, 6], "core": [4, 5, 6], "4vcpu": [4, 5, 6], "memori": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "storag": [4, 5, 6, 7, 12], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 26], "retent": [4, 5, 6], "period": [4, 5, 6, 8, 9], "section": [4, 5, 6, 17, 30], "network": [4, 5, 6, 7, 17], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 17], "perform": [4, 5, 6, 25, 29, 30], "block": [4, 5, 6], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 9, 21, 26, 28, 30], "default": [4, 5, 6, 7, 9, 12, 15, 17, 22, 30], "15": [4, 5, 6], "dai": [4, 5, 6, 7], "around": [4, 5, 6, 17], "200mb": [4, 5, 6], "per": [4, 5, 6, 8, 30], "assum": [4, 5, 6, 7, 8, 9], "scrape": [4, 5, 6], "interv": [4, 5, 6], "6": [4, 5, 6, 12, 14], "node": [4, 5, 7, 14, 17, 19, 20, 21, 25, 26, 28, 29, 30], "cluster": [4, 5, 6, 24, 30], "each": [4, 5, 7, 8, 9, 12, 14, 17, 19, 21, 25, 30], "16": [4, 5, 6, 17], "time": [4, 5, 6, 7, 8, 9, 23, 30], "need": [4, 5, 6, 7, 8, 12, 17, 19, 20, 21, 30], "20gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 12, 17, 27, 30], "replac": [4, 5, 6, 8, 12], "ad": [4, 5, 6, 7, 11], "we": [4, 5, 6, 8, 12, 30], "alloc": [4, 5, 6], "x4": [4, 5, 6], "case": [4, 5, 6, 7, 8, 9, 12, 17, 19, 30], "100gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 9, 12, 17, 30], "fast": [4, 5, 6], "enough": [4, 5, 6], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 9, 12, 17, 19, 25, 30], "out": [4, 5, 6, 8], "box": [4, 5, 6, 8], "instruct": [5, 6], "help": [5, 7, 9, 12, 30], "pleas": [5, 17], "most": [5, 9, 12, 25, 27, 30], "current": [5, 6, 7, 9, 12, 17], "main": 5, "item": 5, "set": [5, 6, 7, 9, 12, 15], "avail": [5, 6, 8, 9, 11, 12, 13, 19, 20, 30], "data": [5, 7, 9, 12, 18, 19, 20, 21, 25, 26, 28, 29, 30], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 17], "befor": [5, 6, 9, 19, 20, 26, 30], "support": [5, 6, 12, 13, 18, 24, 30], "want": [5, 6, 9], "compat": [5, 12, 17], "matrix": [5, 13], "cento": [5, 17], "instanc": [5, 6, 9, 12], "latest": [5, 6, 7], "releas": 5, "wget": [5, 6], "http": [5, 6, 8, 17, 20, 21, 22, 24, 29], "github": [5, 6], "com": [5, 6, 20, 21, 22, 24, 29], "archiv": [5, 6], "tar": [5, 6], "gz": [5, 6], "xvf": [5, 6], "test": [5, 17, 30], "20": [5, 29], "linux": 5, "amd64": 5, "copi": 5, "file": [5, 7, 8, 9, 12, 15], "cp": 5, "p": [5, 7, 8, 17], "home": 5, "cd": [5, 6], "verifi": 5, "point": [5, 6, 12], "browser": [5, 6, 8, 12, 17], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "templat": [5, 6, 8, 17, 30], "edit": [5, 6, 7, 8, 12, 17], "correct": 5, "static": 5, "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 24], "host": [5, 6, 7, 17], "static_config": [5, 6], "target": [5, 7, 12, 15, 17], "127": [5, 7, 17], "right": [5, 6, 12, 25, 30], "local": [5, 6, 7, 8, 12, 17, 30], "typic": [5, 12, 19, 21, 30], "node_export": [5, 6, 7, 14, 17], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 9, 12, 15, 22, 30], "everi": [5, 6, 7], "second": [5, 6, 9, 17], "scrape_timeout": 5, "4": [5, 6, 12, 14], "timeout": 5, "try": [5, 17], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 9], "ani": [5, 6, 9, 12, 17, 25, 30], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": 5, "scrape_config": 5, "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 15, 17], "There": [5, 6, 8, 9, 11, 12, 13, 29, 31], "instead": [5, 6, 8, 30], "those": 5, "found": [5, 6, 7, 9, 12], "must": [5, 6, 26], "even": [5, 6, 7], "add": [5, 7, 8, 9, 12, 15, 30], "center": [5, 6, 8, 30], "cat": 5, "list": [5, 6], "end": [5, 6, 30], "66": [5, 17], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8], "dc1": [5, 6], "172": [5, 6, 17], "17": [5, 6, 14, 17], "dc2": [5, 6], "previou": 5, "about": [5, 9, 12, 25], "deprec": 5, "56090": [5, 17], "mkdir": 5, "mydata": 5, "tsdb": [5, 7, 8], "accumul": 5, "consol": [5, 17], "visibl": 5, "execut": [5, 18, 23], "queri": [5, 25, 26, 28], "through": 5, "node_memory_memfre": 5, "And": 5, "scylla_reactor_util": 5, "At": [5, 12], "emit": 5, "abl": [5, 8], "them": [5, 7, 9, 12, 25], "grafna": 5, "higher": [5, 6, 21, 30], "depend": [5, 8], "repositori": [5, 6], "yum": 5, "zip": 5, "structur": 5, "rest": [5, 8], "access": [5, 7], "sudo": [5, 6, 17], "r": [5, 7, 12, 17], "If": [5, 6, 7, 8, 12, 17, 27, 29, 30], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 12, 17], "provis": [5, 6, 12], "load": [5, 6, 17, 18, 21, 22, 30], "manager_2": 5, "would": [5, 6, 8, 9, 12, 18, 21, 30], "ver_4": 5, "folder": 5, "apivers": 5, "name": [5, 6, 8, 9, 17, 30], "type": [5, 12, 30], "url": [5, 8], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "describ": [6, 8, 15, 17, 30], "setup": 6, "dedic": 6, "so": [6, 7, 8, 9, 12, 17, 21, 30], "pull": [6, 17], "over": 6, "evalu": 6, "laptop": 6, "tabl": [6, 9, 14, 18, 25, 30], "25": [6, 17], "avoid": [6, 12, 17, 22, 24, 30], "root": [6, 17], "go": [6, 17], "group": [6, 9], "groupadd": 6, "log": [6, 8, 17], "new": [6, 17], "activ": [6, 9], "next": [6, 7, 8], "login": [6, 17], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 17], "extract": 6, "binari": [6, 17], "As": [6, 12, 23], "clone": 6, "git": 6, "directli": 6, "checkout": 6, "branch": 6, "restart": [6, 7, 8], "know": [6, 17, 21, 30], "done": [6, 7, 12, 17], "wish": [6, 7], "import": [6, 7], "match": [6, 30], "datacent": 6, "nodetool": 6, "statu": [6, 17], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "work": [6, 7, 8, 9, 12], "": [6, 7, 9, 12, 18, 19, 27, 30], "web": [6, 8], "listen": [6, 7, 15], "inform": [6, 7, 11, 12, 13, 15, 18, 19, 20], "agent": [6, 7, 8, 14, 17], "machin": [6, 7, 17], "overrid": [6, 7, 12], "n": [6, 7], "own": [6, 7, 17], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "multipl": [6, 7, 8, 9, 12, 19, 22, 23, 29, 30], "genconfig": 6, "py": [6, 12], "myconf": 6, "four": 6, "OR": 6, "also": [6, 7, 8, 9, 12], "look": [6, 8, 9, 12, 30], "5090": [6, 17], "do": [6, 7, 12, 17, 21, 30], "l": [6, 7, 17], "10": [6, 9, 12], "within": [6, 9], "cql": [6, 25, 31], "protect": 6, "author": [6, 7], "assign": 6, "limit": [6, 8, 9, 22, 30], "onli": [6, 7, 21, 23, 30], "keyspac": 6, "securejsondata": 6, "part": [6, 9, 18, 21, 25, 30], "place": [6, 7, 8, 12, 30], "outsid": [6, 7], "result": [6, 7, 19, 21, 22, 30], "lost": [6, 7, 12, 30], "exist": [6, 12, 30], "permiss": 6, "somewher": 6, "els": [6, 7], "situat": [6, 7, 9, 30], "firewal": [6, 17], "7000": [6, 17], "myservic": 6, "job": [6, 17], "m": [6, 7], "2019": [6, 14, 29], "reach": [6, 8, 21, 26, 30], "function": [6, 8], "act": [6, 8, 9], "featur": [6, 8], "direct": 6, "send": [6, 9, 21, 22, 26, 28, 30], "than": [6, 9, 12, 30], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "take": [6, 7, 12, 17], "effect": [6, 12, 17], "authent": [6, 7], "disabl": [6, 15], "option": [6, 8, 17], "simplest": 7, "small": 7, "util": [7, 12], "appropri": 7, "h": [7, 12], "print": 7, "exit": 7, "applic": 7, "localhost": 7, "becaus": [7, 17, 26], "cannot": [7, 26], "map": 7, "A": [7, 8, 12, 19, 20, 26, 30], "bind": [7, 15], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 20, 23, 25], "addit": [7, 9, 11, 13, 30], "auto": 7, "automat": 7, "failur": [7, 17], "g": 7, "gui": [7, 12, 17], "keep": 7, "clear": 7, "comma": 7, "separ": 7, "come": [7, 9], "specif": [7, 9, 15, 17, 27, 30], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "role": 7, "privileg": 7, "That": [7, 9, 12], "mean": [7, 12, 18, 19, 20, 21, 22, 26, 28, 30], "thei": [7, 9, 29], "chang": [7, 12, 15, 17], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 12], "b": 7, "o": [7, 14, 25], "disk": [7, 9, 12, 17, 18, 20, 25], "besid": [7, 30], "relev": [7, 25], "possibl": [7, 9, 15, 24, 30], "api": [7, 8, 15], "resolv": 7, "explicitli": [7, 12], "week": 7, "common": [7, 30], "request": [7, 15, 25], "how": [7, 8, 9, 12, 19, 20, 21, 25, 30], "someth": [7, 9, 10, 12], "opportun": 7, "demonstr": 7, "cover": 7, "30": [7, 9], "30d": 7, "anoth": [7, 9], "arbitrari": 7, "opensourc": 8, "top": 8, "additiuon": 8, "high": [8, 12, 20], "horizont": 8, "scale": 8, "backup": 8, "benefit": [8, 30], "flexibl": 8, "design": 8, "some": [8, 9, 25, 29], "front": 8, "few": 8, "reason": [8, 12, 17, 28, 30], "why": [8, 12], "total": [8, 12], "million": 8, "singl": [8, 12, 25], "capac": 8, "sometim": 8, "traffic": [8, 17, 29, 30], "between": [8, 17, 25, 30], "reachabl": 8, "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 12, 20], "expos": [8, 15], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 25], "10903": 8, "10904": 8, "replica": [8, 19, 20, 21, 25, 26, 30], "connect": [8, 12, 15, 17], "abov": 8, "last": 8, "db_address": 8, "could": [8, 25, 29, 30], "long": [8, 9], "now": [8, 9], "enhanc": [9, 10], "notifi": [9, 10, 25], "wrong": [9, 10, 12, 17, 30], "shown": [9, 17], "overview": [9, 20, 25], "sent": [9, 26, 28], "email": 9, "slack": 9, "condit": 9, "met": 9, "certain": 9, "defin": [9, 12, 24, 30], "what": 9, "happen": [9, 17], "report": [9, 14, 17, 30], "let": 9, "u": 9, "instancedown": 9, "expr": [9, 12], "60": 9, "sever": [9, 11, 13, 31], "annot": 9, "descript": [9, 25], "been": 9, "summari": 9, "legal": 9, "express": 9, "equal": 9, "minim": 9, "durat": 9, "prior": 9, "pend": 9, "mode": [9, 12], "special": 9, "notif": 9, "forward": 9, "respons": 9, "duplic": [9, 30], "rout": [9, 21, 30], "repres": 9, "tree": 9, "win": [9, 17], "inhibit": 9, "mute": 9, "receiv": [9, 30], "via": [9, 17], "sluck": 9, "check": [9, 17, 27, 28, 30], "detail": [9, 25], "wors": 9, "correctli": [9, 12], "mail": 9, "simpl": 9, "negat": 9, "logic": 9, "forc": 9, "reduc": [9, 12, 19], "simul": 9, "actual": [9, 28], "scenario": 9, "expect": 9, "low": [9, 30], "space": 9, "lower": [9, 30], "fire": 9, "show": [9, 12, 14, 30], "propag": 9, "valu": [9, 12, 23, 30], "similar": [9, 12], "free": 9, "big": [9, 30], "bisect": 9, "problem": [9, 25, 30], "give": [11, 13], "modifi": 11, "upgrad": 11, "explain": [12, 25], "intern": [12, 21, 30], "issu": [12, 25, 29, 30], "whenev": 12, "gone": 12, "save": 12, "mention": 12, "earlier": 12, "overridden": 12, "perman": 12, "eventu": 12, "made": 12, "larg": [12, 25], "suggest": 12, "maintain": 12, "json": 12, "too": 12, "verbos": 12, "element": [12, 25], "object": 12, "attribut": 12, "graph": [12, 30], "aliascolor": 12, "bar": 12, "error": [12, 25, 26, 28], "fill": 12, "grid": 12, "threshold1": 12, "null": 12, "threshold1color": 12, "rgba": 12, "216": 12, "200": 12, "27": 12, "threshold2": 12, "threshold2color": 12, "234": 12, "112": 12, "22": 12, "gridpo": 12, "w": [12, 17], "x": [12, 17], "y": 12, "id": [12, 17], "isnew": 12, "legend": 12, "avg": 12, "max": 12, "min": 12, "linewidth": 12, "link": [12, 25], "nullpointmod": 12, "percentag": [12, 30], "pointradiu": 12, "render": 12, "flot": 12, "seriesoverrid": 12, "span": 12, "steppedlin": 12, "sum": 12, "node_filesystem_avail": 12, "intervalfactor": 12, "legendformat": 12, "refid": 12, "timefrom": 12, "timeshift": 12, "titl": 12, "size": [12, 22, 30], "tooltip": 12, "msresolut": 12, "share": 12, "sort": [12, 24, 30], "value_typ": 12, "cumul": 12, "transpar": 12, "xaxi": 12, "yax": 12, "percent": 12, "logbas": 12, "101": 12, "short": 12, "imagin": 12, "redund": 12, "resembl": 12, "css": 12, "hierarch": 12, "definit": [12, 30], "inherit": 12, "row": [12, 24, 30], "base_row": 12, "collaps": 12, "height": 12, "250px": 12, "150px": 12, "output": 12, "bytes_panel": 12, "byte": 12, "unit": 12, "axi": 12, "adjust": 12, "readabl": 12, "e": 12, "gb": 12, "mb": 12, "grasp": 12, "origin": [12, 27], "12": [12, 17], "wa": [12, 30], "larger": 12, "break": [12, 22, 30], "longer": 12, "later": 12, "absolut": 12, "posit": 12, "ie": 12, "width": 12, "backward": [12, 17], "ve": 12, "had": 12, "pars": [12, 23, 30], "imposs": 12, "hand": 12, "overcom": 12, "transit": 12, "calcul": 12, "taken": 12, "still": 12, "unlik": 12, "partial": 12, "24": 12, "don": 12, "python": 12, "make_dashboard": 12, "revers": [12, 25], "usual": [12, 17, 25, 30], "easier": 12, "wrapper": 12, "re": [12, 21], "just": 12, "refresh": 12, "generate_gener": 12, "mayb": 12, "interfac": [13, 17], "2021": 14, "2018": [14, 22], "14": [14, 17], "onlin": 15, "prometheus_port": 15, "restrict": 15, "prometheus_address": 15, "integr": 16, "old": 17, "howev": 17, "twice": 17, "easiest": 17, "remov": 17, "scylla_manager1": 17, "messag": 17, "wait": [17, 26], "non": [17, 20, 21, 25, 29, 30], "post": 17, "proper": 17, "past": 17, "mai": [17, 25, 26, 30], "ownership": 17, "la": 17, "grep": 17, "drwxr": 17, "xr": 17, "4096": 17, "jun": 17, "51": 17, "chown": 17, "appear": 17, "unreach": [17, 26], "immedi": 17, "suspect": 17, "tab": 17, "rang": [17, 30], "align": 17, "On": [17, 25], "41bd3db26240": 17, "entrypoin": 17, "ago": 17, "23": 17, "7001": 17, "tcp": 17, "9042": 17, "9160": 17, "10000": 17, "click": 17, "usag": [17, 21, 30], "fetch": 17, "curl": 17, "scylla_nod": 17, "return": [17, 18, 19, 20, 22, 26, 28, 30], "ef": 17, "gre": 17, "scylla_setup": 17, "9100": 17, "while": 17, "captur": 17, "tshark": 17, "f": 17, "dst": 17, "eth0": 17, "toward": 17, "199": 17, "203": 17, "229": 17, "89": 17, "142": 17, "59212": 17, "ack": 17, "seq": 17, "317": 17, "78193": 17, "158080": 17, "len": 17, "tsval": 17, "79869679": 17, "tsecr": 17, "3347447210": 17, "74": 17, "60440": 17, "syn": 17, "29200": 17, "mss": 17, "1460": 17, "sack_perm": 17, "79988291": 17, "128": 17, "side": [18, 25, 30], "primari": [18, 30], "kei": [18, 24, 30], "scan": 18, "These": [18, 30], "kind": [18, 30], "bigger": 18, "care": [18, 19, 20, 30], "replicationfactor": [19, 20], "piec": 19, "determin": [19, 20, 26, 30], "mani": [19, 20, 30], "repli": [19, 20, 22, 26, 28, 30], "fail": [19, 21, 25, 30], "unavail": [19, 30], "client": [19, 22, 25, 30], "respond": 19, "accompani": 19, "deep": 19, "understand": 19, "fall": 19, "back": 19, "mechan": 19, "write": 20, "acknowledg": 20, "coordin": [20, 21, 26, 28, 30], "hint": 20, "fact": 20, "yet": 20, "cours": [20, 21], "essenti": 20, "text": [20, 30], "20of": 20, "20the": 20, "20most": 20, "20common": 20, "20with": 20, "20lowest": 20, "20consist": 20, "distribut": [21, 29, 30], "ideal": [21, 30], "latenc": [21, 25, 30], "resourc": [21, 24, 30], "driver": [21, 22, 29, 30], "replic": [21, 26, 28, 30], "prepar": [21, 25, 29], "statement": [21, 23, 29], "balanc": [21, 25, 30], "polici": 21, "caus": [21, 30], "intro": 21, "recap": 21, "ring": [21, 30], "architectur": 21, "chunk": [22, 30], "increas": [22, 30], "overal": [22, 30], "thu": 22, "www": [22, 29], "07": 22, "13": 22, "effici": [22, 30], "optim": [23, 29, 31], "concret": 23, "thumb": 23, "alwai": 23, "favor": 23, "partit": [24, 25], "BY": [24, 30], "ineffici": [24, 30], "consum": 24, "doc": 24, "recogn": 25, "bad": 25, "practic": [25, 29], "potenti": [25, 30], "solv": 25, "left": 25, "categori": [25, 30], "jump": 25, "warn": 25, "cell": 25, "indic": [25, 30], "model": [25, 29, 30], "code": 25, "impact": 25, "imbal": 25, "shard": 25, "imbalanc": 25, "hot": 25, "bottleneck": [25, 29], "cach": 25, "hit": 25, "filter": 25, "token": 25, "awar": 25, "select": [25, 30], "page": 25, "order": [25, 30], "oper": [25, 30], "due": 25, "unsatisfi": 25, "faulti": 25, "answer": [26, 28], "aka": 26, "factor": 26, "quorum": [26, 30], "hardwar": 27, "occur": 27, "leav": 28, "risk": 28, "identifi": [28, 30], "evenli": 29, "across": 29, "becom": 29, "explan": 29, "08": 29, "best": 29, "upper": 30, "relat": 30, "gaug": 30, "inspect": 30, "zero": 30, "mislead": 30, "panel": 30, "first": 30, "holder": 30, "safer": 30, "prevent": 30, "inject": 30, "rate": 30, "did": 30, "compound": 30, "column": 30, "ks1": 30, "table_demo": 30, "int": 30, "WITH": 30, "desc": 30, "cat1": 30, "asc": 30, "overhead": 30, "thing": 30, "much": 30, "drop": 30, "were": 30, "major": 30, "success": 30, "hurt": 30, "cl": 30, "expens": 30, "term": 30, "cost": 30, "ONE": 30, "local_quorum": 30, "local_on": 30, "reli": 30, "nearest": 30, "advisor": 31}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 20, 25, 31], "monitor": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 25, 31], "stack": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 25, 31], "us": [2, 6, 8, 12, 18, 19, 20, 24, 31], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 12], "set": 2, "prometheu": [2, 4, 5, 6, 7, 8, 9, 15], "grafana": [2, 5, 6, 7, 12, 17], "provis": 2, "data": [2, 6, 8, 17], "sourc": [2, 8, 17], "file": [2, 6, 17], "dashboard": [2, 6, 12], "load": 2, "start": [2, 6, 7, 17], "stop": [2, 6], "download": 3, "instal": [3, 5, 6], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 12], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 27], "space": [4, 5, 6], "requir": [4, 5, 6], "deploi": 5, "without": 5, "alertmanag": [5, 9], "compat": 6, "matrix": [6, 14], "post": [6, 22, 29], "configur": [6, 8], "node": [6, 27], "from": [6, 12], "manag": [6, 7, 10, 17], "consul": 6, "api": 6, "connect": 6, "an": [6, 9], "extern": 6, "directori": [6, 17], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": 6, "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 12, 25, 30], "all": [7, 19], "sh": [7, 12], "command": 7, "gener": [7, 12], "option": 7, "relat": 7, "ldap": 7, "support": [7, 14], "retent": 7, "period": 7, "alert": [7, 9, 10], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 18, 19, 20, 21, 22, 23, 24, 29, 30], "updat": 8, "tip": 9, "when": 9, "ad": [9, 12], "procedur": 11, "modifi": 12, "limit": 12, "consist": [12, 19, 20, 26, 30], "between": 12, "restart": 12, "upgrad": [12, 17], "templat": 12, "class": 12, "panel": 12, "exampl": 12, "format": 12, "layout": 12, "valid": 12, "refer": 13, "guid": [13, 16], "interfac": 15, "troubleshoot": [16, 17], "problem": 17, "2": 17, "duplic": 17, "inform": 17, "A": 17, "contain": 17, "fail": [17, 26, 28], "To": 17, "And": 17, "permiss": 17, "No": 17, "point": 17, "solut": 17, "chart": 17, "show": 17, "error": [17, 27], "sign": 17, "server": 17, "level": [17, 19, 20, 26, 30], "metric": 17, "notic": 17, "user": 17, "open": 17, "3": 17, "0": 17, "enterpris": 17, "2019": 17, "1": 17, "work": 17, "wireshark": 17, "some": [18, 19, 20, 21, 22, 23, 24, 26, 28], "allow": [18, 30], "filter": [18, 30], "ani": 20, "link": [20, 21, 22, 24, 29], "univers": [20, 21], "ar": [21, 22, 23, 29], "token": [21, 30], "awar": [21, 30], "select": 22, "non": [22, 23], "page": [22, 30], "blog": [22, 29], "prepar": [23, 30], "revers": [24, 30], "order": 24, "document": 24, "advisor": 25, "section": 25, "oper": [26, 28], "due": 26, "unsatisfi": 26, "i": 27, "o": 27, "can": 27, "indic": 27, "faulti": 27, "replica": 28, "side": 28, "cql": [29, 30], "balanc": 29, "among": 29, "shard": 29, "optim": 30, "statement": 30, "read": 30, "cross": 30, "dc": 30, "request": 30}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some queries use ALLOW FILTERING": [[18, "some-queries-use-allow-filtering"]], "Some queries use Consistency Level: ANY": [[20, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[20, "link-to-scylla-university"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[16, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Some queries are not token-aware": [[21, "some-queries-are-not-token-aware"]], "University link": [[21, "university-link"]], "Some queries are non-prepared": [[23, "some-queries-are-non-prepared"]], "Some SELECT queries are non-paged": [[22, "some-select-queries-are-non-paged"]], "Blog-post Links": [[22, "blog-post-links"]], "Some queries use Consistency Level: ALL": [[19, "some-queries-use-consistency-level-all"]], "Troubleshoot Scylla Monitoring Stack": [[17, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[17, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[17, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[17, "a-container-fails-to-start"]], "Files And Directory Permissions": [[17, "files-and-directory-permissions"]], "No Data Points": [[17, "no-data-points"]], "Solution": [[17, "solution"], [17, "id1"], [17, "id2"], [17, "id3"]], "Grafana Chart Shows Error (!) Sign": [[17, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[17, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[17, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[17, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[17, "working-with-wireshark"]], "Some operations failed on the replica side": [[28, "some-operations-failed-on-the-replica-side"]], "I/O Errors can indicate a node with a faulty disk": [[27, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "CQL queries are not balanced among shards": [[29, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[29, "blog-post-link"]], "Using Scylla Monitoring Stack": [[31, "using-scylla-monitoring-stack"]], "Scylla Monitoring Stack Advisor": [[25, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[25, "the-advisor-section"]], "Some queries use reverse order": [[24, "some-queries-use-reverse-order"]], "Documentation link": [[24, "documentation-link"]], "Some operation failed due to unsatisfied consistency level": [[26, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "The CQL Optimization": [[30, "the-cql-optimization"]], "Prepared Statements": [[30, "prepared-statements"]], "Token Aware": [[30, "token-aware"]], "Paged Queries": [[30, "paged-queries"]], "Reversed CQL Reads": [[30, "reversed-cql-reads"]], "ALLOW FILTERING": [[30, "allow-filtering"]], "Consistency Level": [[30, "consistency-level"]], "Cross DC": [[30, "cross-dc"]], "Cross DC Consistency Level": [[30, "cross-dc-consistency-level"]], "Cross DC read requests": [[30, "cross-dc-read-requests"]], "Scylla Monitoring Stack Reference Guide": [[13, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Support Matrix": [[14, "scylla-monitoring-stack-support-matrix"]], "Scylla Monitoring Stack Alert Manager": [[10, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Stack Interfaces": [[15, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[15, "prometheus"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Adding and Modifying Dashboards": [[12, "adding-and-modifying-dashboards"]], "General Limitations": [[12, "general-limitations"]], "consistency between restarts": [[12, "consistency-between-restarts"]], "consistency between upgrades": [[12, "consistency-between-upgrades"]], "Using templated Dashboards": [[12, "using-templated-dashboards"]], "The template class system": [[12, "the-template-class-system"]], "Panel example": [[12, "panel-example"]], "Grafana Formats and Layouts": [[12, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[12, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[12, "prerequisite"], [2, "prerequisite"]], "Validation": [[12, "validation"]], "Scylla Monitoring Stack Procedures": [[11, "scylla-monitoring-stack-procedures"]], "Alerting": [[9, "alerting"]], "Prometheus Alerts": [[9, "prometheus-alerts"]], "Alertmanager": [[9, "alertmanager"]], "Tips When Adding an Alert": [[9, "tips-when-adding-an-alert"]], "The start-all.sh command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Scylla Monitoring Stack": [[1, "scylla-monitoring-stack"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.7/sitemap.xml b/branch-3.7/sitemap.xml new file mode 100644 index 000000000..510c0813c --- /dev/null +++ b/branch-3.7/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.7/troubleshooting/index.html b/branch-3.7/troubleshooting/index.html new file mode 100644 index 000000000..a6a7c2167 --- /dev/null +++ b/branch-3.7/troubleshooting/index.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Troubleshooting Guide for Scylla Monitoring Stack

              +
              +
              +

              Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/troubleshooting/monitor_troubleshoot.html b/branch-3.7/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..b0bed6d94 --- /dev/null +++ b/branch-3.7/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,852 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Troubleshoot Scylla Monitoring Stack

              +

              This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

              +
              +

              Problem

              + +
              +

              Scylla-Manager 2.2 with Duplicate information

              +

              Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

              +
                +
              • For Manager server: from 56090 to 5090

              • +
              • For Manager Agent: from 56090 to 5090

              • +
              +

              For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

              +

              However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

              +

              The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

              +

              Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

              +
              +
              +

              A Container Fails To Start

              +

              When running ./start-all.sh a container can fail to start. For example you can see the following error message:

              +
              Wait for Prometheus container to start........Error: Prometheus container failed to start
              +
              +
              +

              Should this happen, check the Docker logs for more information.

              +
              docker logs aprom
              +
              +
              +

              Usually the reason for the failure is described in the logs.

              +
              +
              +

              Files And Directory Permissions

              +
              +

              Note

              +

              Avoid running Docker containers as root.

              +
              +

              The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

              +

              If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

              +
              +

              Note

              +

              If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

              +
              +

              For example if your Prometheus data directory is /prom-data and you are using centos user

              +
              ls -la /|grep prom-data
              +
              +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
              +
              +sudo chown -R centos:centos /prom-data
              +
              +ls -la /|grep prom-data
              +
              +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
              +
              +
              +
              +
              +

              No Data Points

              +

              No data points on all data charts.

              +
              +

              Solution

              +

              If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

              +
                +
              1. Login to the Prometheus console:

              2. +
              3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

              4. +
              5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

              6. +
              +
              +
                +
              • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

              • +
              • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

              • +
              • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

              • +
              +
              +

              For example:

              +
              ./start-all.sh -v 3.1
              +
              +
              +

              More on start-all.sh options.

              +
              +
              +
              +

              Grafana Chart Shows Error (!) Sign

              +

              Run this procedure on the Scylla Monitoring Stack server.

              +

              If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

              +
              +

              Solution

              +

              On the Scylla Monitoring Stack server:

              +
                +
              1. Check Prometheus is running using docker ps.

              2. +
              +
                +
              • If it is not running check the prometheus.yml for errors.

              • +
              +

              For example:

              +
              CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
              +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
              +
              +
              +
                +
              • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

              • +
              +
              +
              +
              +

              Grafana Shows Server Level Metrics, but not Scylla Metrics

              +

              Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

              +
              +

              Solution

              +
                +
              • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

              • +
              +

              For example

              +
              curl 172.17.0.2:9180/metrics
              +
              +
              +
              +
              +
              +

              Grafana Shows Scylla Metrics, but not Server Level Metrics

              +

              Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

              +
              +

              Solution

              +

              1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

              +
                +
              1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

              2. +
              +
              +
              +

              Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

              +

              While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

              +

              If the node_exporter service is not starting it may need to be updated manually.

              +

              Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

              +
              +
              +
              +

              Working with Wireshark

              +

              No metrics shown in the Scylla Monitoring Stack.

              +
                +
              1. Install wireshark

              2. +
              +

              2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

              +

              For example:

              +
              tshark -i eth0 -f "dst port 9180"
              +
              +
              +

              Capture from Scylla node towards Scylla Monitoring Stack server.

              +

              In this example, Scylla is running.

              +
              Monitor ip        Scylla node ip
              +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
              +
              +
              +

              In this example, Scylla is not running

              +
              Monitor ip        Scylla node ip
              +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
              +
              +
              +
              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlAllowFiltering.html b/branch-3.7/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..8eab88957 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,652 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries use ALLOW FILTERING

              +

              Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

              +

              These kinds of queries can create a bigger load on Scylla, and should be used with care.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlCLAll.html b/branch-3.7/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..24f6e4106 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries use Consistency Level: ALL

              +

              Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

              +

              Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

              +

              Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlCLAny.html b/branch-3.7/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..b87c3ee12 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries use Consistency Level: ANY

              +

              Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

              +

              Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlNoTokenAware.html b/branch-3.7/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..4a34f2489 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries are not token-aware

              +

              Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

              +

              Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlNonPaged.html b/branch-3.7/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..6eac732db --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some SELECT queries are non-paged

              +

              By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

              +
              +

              Blog-post Links

              +

              https://www.scylladb.com/2018/07/13/efficient-query-paging/

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlNonPrepared.html b/branch-3.7/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..74729efae --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,652 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries are non-prepared

              +

              Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/cqlReverseOrder.html b/branch-3.7/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..b512bec28 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              Some queries use reverse order

              +

              Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

              +

              Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/index.html b/branch-3.7/use-monitoring/advisor/index.html new file mode 100644 index 000000000..f2d973f00 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/index.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Scylla Monitoring Stack Advisor

              +
              +
              +

              The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them.

              +
              +

              The Advisor section

              +
              +../../_images/advisor_panel.png +
              +

              The Advisor section

              +
              +
              +

              The Advisor section is located on the Overview dashboard and consists of two parts:

              +

              On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

              +

              For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

              +

              On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

              +

              For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

              +

              Each Advisor issue is explained in detail:

              + +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/nodeCLErrors.html b/branch-3.7/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..a28c0a2fb --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Some operation failed due to unsatisfied consistency level

              +

              ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

              +

              For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

              +

              When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/nodeIOErrors.html b/branch-3.7/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..9b348c8ba --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,651 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              I/O Errors can indicate a node with a faulty disk

              +

              I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/nodeLocalErrors.html b/branch-3.7/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..54ef245ff --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,652 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Some operations failed on the replica side

              +

              ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

              +

              An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-3.7/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..7e074cb71 --- /dev/null +++ b/branch-3.7/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              CQL queries are not balanced among shards

              +

              For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

              +

              There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

              +
              +

              Blog post link

              +

              https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/cql_optimization.html b/branch-3.7/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..9e727ee29 --- /dev/null +++ b/branch-3.7/use-monitoring/cql_optimization.html @@ -0,0 +1,773 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + + + +
              +

              The CQL Optimization

              +

              The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

              +
              +../_images/cql_optimization_master.png +
              +

              The CQL Dashboard

              +
              +
              +

              The upper part of the dashboard holds CQL related metrics.

              +

              The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

              +
              +

              Note

              +

              Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

              +
              +

              The following sections describe each of the dashboard’s panel

              +
              +

              Prepared Statements

              +

              Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

              +

              Using prepared statements has the following benefits:

              +
                +
              • The database only needs to parse the query once

              • +
              • The driver can route the query to the right node

              • +
              • Using place-holders and values is safer and prevents CQL-Injection

              • +
              +

              The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

              +

              The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

              +
              +
              +

              Token Aware

              +

              Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

              +

              Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

              +

              The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

              +

              The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

              +
              +
              +

              Paged Queries

              +

              By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

              +

              The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

              +

              The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

              +
              +
              +

              Reversed CQL Reads

              +

              Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

              +

              Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

              +

              For example, look at the following table:

              +
              CREATE TABLE ks1.table_demo (
              +   category text,
              +   type int,
              +   PRIMARY KEY (category, type))
              +WITH CLUSTERING ORDER BY (type DESC);
              +
              +
              +

              The following query uses reverse order:

              +
              select * from ks1.table_demo where category='cat1' order by type ASC;
              +
              +
              +

              The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

              +

              The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

              +
              +
              +

              ALLOW FILTERING

              +

              Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

              +

              These kinds of queries can create a big load on the system, and should be used with care.

              +

              The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

              +

              The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

              +

              The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

              +

              The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

              +

              The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

              +
              +
              +

              Consistency Level

              +

              Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

              +

              The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

              +

              Two consistency levels hold a potential problem and should be used with care ANY and ALL.

              +

              The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

              +

              The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

              +

              The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

              +

              The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

              +
              +
              +

              Cross DC

              +

              Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

              +
              +
              +

              Cross DC Consistency Level

              +

              Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

              +
              +
              +

              Cross DC read requests

              +
              +

              Note

              +

              The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

              +
              +

              In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

              +

              The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

              +
              +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.7/use-monitoring/index.html b/branch-3.7/use-monitoring/index.html new file mode 100644 index 000000000..7f6b333bb --- /dev/null +++ b/branch-3.7/use-monitoring/index.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +
              +

              Using Scylla Monitoring Stack

              +
              +
              +

              There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

              + +
              + + +
              + + + + + + + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.8/.buildinfo b/branch-3.8/.buildinfo new file mode 100644 index 000000000..5e7add79c --- /dev/null +++ b/branch-3.8/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: eec163df19595c401eaebe121ecfe170 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.8/.doctrees/_common/monitor-description.doctree b/branch-3.8/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..08b403e78 Binary files /dev/null and b/branch-3.8/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.8/.doctrees/environment.pickle b/branch-3.8/.doctrees/environment.pickle new file mode 100644 index 000000000..36161b6e9 Binary files /dev/null and b/branch-3.8/.doctrees/environment.pickle differ diff --git a/branch-3.8/.doctrees/index.doctree b/branch-3.8/.doctrees/index.doctree new file mode 100644 index 000000000..1e22785cc Binary files /dev/null and b/branch-3.8/.doctrees/index.doctree differ diff --git a/branch-3.8/.doctrees/install/docker_compose.doctree b/branch-3.8/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..0304bca2b Binary files /dev/null and b/branch-3.8/.doctrees/install/docker_compose.doctree differ diff --git a/branch-3.8/.doctrees/install/index.doctree b/branch-3.8/.doctrees/install/index.doctree new file mode 100644 index 000000000..832a335a1 Binary files /dev/null and b/branch-3.8/.doctrees/install/index.doctree differ diff --git a/branch-3.8/.doctrees/install/min-prod-hw.doctree b/branch-3.8/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..cb9e4804e Binary files /dev/null and b/branch-3.8/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-3.8/.doctrees/install/monitor_without_docker.doctree b/branch-3.8/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..e184240cd Binary files /dev/null and b/branch-3.8/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-3.8/.doctrees/install/monitoring_stack.doctree b/branch-3.8/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..91f72c612 Binary files /dev/null and b/branch-3.8/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-3.8/.doctrees/install/start_all.doctree b/branch-3.8/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..67acb1f07 Binary files /dev/null and b/branch-3.8/.doctrees/install/start_all.doctree differ diff --git a/branch-3.8/.doctrees/install/thanos.doctree b/branch-3.8/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..195f63448 Binary files /dev/null and b/branch-3.8/.doctrees/install/thanos.doctree differ diff --git a/branch-3.8/.doctrees/procedures/alerts/alerting.doctree b/branch-3.8/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..5352178b2 Binary files /dev/null and b/branch-3.8/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-3.8/.doctrees/procedures/alerts/index.doctree b/branch-3.8/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..e98d74264 Binary files /dev/null and b/branch-3.8/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-3.8/.doctrees/procedures/index.doctree b/branch-3.8/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..5d2ccb36e Binary files /dev/null and b/branch-3.8/.doctrees/procedures/index.doctree differ diff --git a/branch-3.8/.doctrees/procedures/updating_dashboard.doctree b/branch-3.8/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..dcdcbecd3 Binary files /dev/null and b/branch-3.8/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-3.8/.doctrees/reference/index.doctree b/branch-3.8/.doctrees/reference/index.doctree new file mode 100644 index 000000000..73081a465 Binary files /dev/null and b/branch-3.8/.doctrees/reference/index.doctree differ diff --git a/branch-3.8/.doctrees/reference/matrix.doctree b/branch-3.8/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..c0ebdbbdf Binary files /dev/null and b/branch-3.8/.doctrees/reference/matrix.doctree differ diff --git a/branch-3.8/.doctrees/reference/monitoring_apis.doctree b/branch-3.8/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..7a0147859 Binary files /dev/null and b/branch-3.8/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-3.8/.doctrees/troubleshooting/index.doctree b/branch-3.8/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..22b9a30c4 Binary files /dev/null and b/branch-3.8/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-3.8/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-3.8/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..826c4ce5f Binary files /dev/null and b/branch-3.8/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..8513c6d46 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..83ab8a15b Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..0c5073915 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..fcaef3517 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..efeb2abe8 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..48e110342 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..5ec6896ec Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/index.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..e8ab80e94 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..3a3e38dcc Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..caf75a37c Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..99a30829b Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..f2b664f94 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-3.8/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..b4050ecf0 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/cql_optimization.doctree b/branch-3.8/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..1ef2d8561 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-3.8/.doctrees/use-monitoring/index.doctree b/branch-3.8/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..35a5cb930 Binary files /dev/null and b/branch-3.8/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-3.8/.nojekyll b/branch-3.8/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.8/404.html b/branch-3.8/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.8/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
              +

              404

              +

              The ScyllaDB monster ate your page!

              +

              + Home +

              +
              + + + \ No newline at end of file diff --git a/branch-3.8/CNAME b/branch-3.8/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.8/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.8/_common/monitor-description.html b/branch-3.8/_common/monitor-description.html new file mode 100644 index 000000000..a91acfadd --- /dev/null +++ b/branch-3.8/_common/monitor-description.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + +
              +
              + Menu +
              +
              +
              +
              +
              + + +
              +

              Caution

              +

              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

              +
              + + + +
              + +
              + +

              Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

              + + +
              + + + + + +
              + + +
              + +
              + +
              + + + + +
              + + + + + + + \ No newline at end of file diff --git a/branch-3.8/_images/1.png b/branch-3.8/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.8/_images/1.png differ diff --git a/branch-3.8/_images/2.png b/branch-3.8/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.8/_images/2.png differ diff --git a/branch-3.8/_images/3.png b/branch-3.8/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.8/_images/3.png differ diff --git a/branch-3.8/_images/advisor_panel.png b/branch-3.8/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.8/_images/advisor_panel.png differ diff --git a/branch-3.8/_images/alertmanager.png b/branch-3.8/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.8/_images/alertmanager.png differ diff --git a/branch-3.8/_images/cql_optimization_master.png b/branch-3.8/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.8/_images/cql_optimization_master.png differ diff --git a/branch-3.8/_images/grafana.png b/branch-3.8/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.8/_images/grafana.png differ diff --git a/branch-3.8/_images/monitor.png b/branch-3.8/_images/monitor.png new file mode 100644 index 000000000..26d107a71 Binary files /dev/null and b/branch-3.8/_images/monitor.png differ diff --git a/branch-3.8/_images/monitoring_stack.png b/branch-3.8/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.8/_images/monitoring_stack.png differ diff --git a/branch-3.8/_sources/_common/monitor-description.rst.txt b/branch-3.8/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.8/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.8/_sources/index.rst.txt b/branch-3.8/_sources/index.rst.txt new file mode 100644 index 000000000..4ab026528 --- /dev/null +++ b/branch-3.8/_sources/index.rst.txt @@ -0,0 +1,36 @@ +Scylla Monitoring Stack +======================= + +.. toctree:: + :maxdepth: 1 + :hidden: + + User Guide + Download and Install + Procedures + Troubleshooting + Reference + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-3.8/_sources/install/docker_compose.rst.txt b/branch-3.8/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.8/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.8/_sources/install/index.rst.txt b/branch-3.8/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-3.8/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-3.8/_sources/install/min-prod-hw.rst.txt b/branch-3.8/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..db5d9c860 --- /dev/null +++ b/branch-3.8/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,24 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need **minimal** disk space of + +.. code:: + + 6 * 16 * 200MB ~ 20GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. diff --git a/branch-3.8/_sources/install/monitor_without_docker.rst.txt b/branch-3.8/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..33d0b1178 --- /dev/null +++ b/branch-3.8/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,437 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.8.0.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.5/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.8.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.7.0/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.7.0/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-3.7.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd scylla-monitoring-scylla-monitoring-3.7.0/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.7.0/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.8/_sources/install/monitoring_stack.rst.txt b/branch-3.8/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..966a30137 --- /dev/null +++ b/branch-3.8/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,378 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Stack Without Docker `_ . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.8 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.8/_sources/install/start_all.rst.txt b/branch-3.8/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..752a98a12 --- /dev/null +++ b/branch-3.8/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "-storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.8/_sources/install/thanos.rst.txt b/branch-3.8/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..ffaf430af --- /dev/null +++ b/branch-3.8/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912 + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903 + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + \ No newline at end of file diff --git a/branch-3.8/_sources/procedures/alerts/alerting.rst.txt b/branch-3.8/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.8/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.8/_sources/procedures/alerts/index.rst.txt b/branch-3.8/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-3.8/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-3.8/_sources/procedures/index.rst.txt b/branch-3.8/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-3.8/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-3.8/_sources/procedures/updating_dashboard.rst.txt b/branch-3.8/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..5113102a8 --- /dev/null +++ b/branch-3.8/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,302 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It will explain about Scylla Monitoring Stack dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitoring Stack dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.8/_sources/reference/index.rst.txt b/branch-3.8/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-3.8/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-3.8/_sources/reference/matrix.rst.txt b/branch-3.8/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..6552164b0 --- /dev/null +++ b/branch-3.8/_sources/reference/matrix.rst.txt @@ -0,0 +1,105 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.8/_sources/reference/monitoring_apis.rst.txt b/branch-3.8/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..6d64821bc --- /dev/null +++ b/branch-3.8/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.8/_sources/troubleshooting/index.rst.txt b/branch-3.8/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-3.8/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-3.8/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-3.8/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..2cc1457ea --- /dev/null +++ b/branch-3.8/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..98a3b14d3 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/scylla-essentials-overview/lessons/high-availability/topic/consistency-level/#:~:text=Some%20of%20the%20most%20common,availability%20with%20the%20lowest%20consistency. diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-3.8/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-3.8/_sources/use-monitoring/advisor/index.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..e037ff90a --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-3.8/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-3.8/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-3.8/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-3.8/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-3.8/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-3.8/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-3.8/_sources/use-monitoring/cql_optimization.rst.txt b/branch-3.8/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..eafc82e4b --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.8/_sources/use-monitoring/index.rst.txt b/branch-3.8/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-3.8/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-3.8/_static/basic.css b/branch-3.8/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.8/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.8/_static/check-solid.svg b/branch-3.8/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.8/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.8/_static/clipboard.min.js b/branch-3.8/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.8/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.8/_static/copybutton.css b/branch-3.8/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.8/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

              Short

              + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.8/_static/copybutton.js b/branch-3.8/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.8/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.8/_static/copybutton_funcs.js b/branch-3.8/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.8/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.8/_static/css/main.css b/branch-3.8/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-3.8/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.8/_static/doctools.js b/branch-3.8/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.8/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.8/_static/documentation_options.js b/branch-3.8/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.8/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.8/_static/file.png b/branch-3.8/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.8/_static/file.png differ diff --git a/branch-3.8/_static/img/banner-background.svg b/branch-3.8/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.8/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.8/_static/img/favicon-228x228.png b/branch-3.8/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.8/_static/img/favicon-228x228.png differ diff --git a/branch-3.8/_static/img/favicon-32x32.png b/branch-3.8/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.8/_static/img/favicon-32x32.png differ diff --git a/branch-3.8/_static/img/favicon.ico b/branch-3.8/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.8/_static/img/favicon.ico differ diff --git a/branch-3.8/_static/img/icons/icon-about-team.svg b/branch-3.8/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.8/_static/img/icons/icon-about-us-m.svg b/branch-3.8/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-about-us.svg b/branch-3.8/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-alternator.svg b/branch-3.8/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-apps.svg b/branch-3.8/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-architecture.svg b/branch-3.8/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.8/_static/img/icons/icon-benchmarks.svg b/branch-3.8/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.8/_static/img/icons/icon-blog.svg b/branch-3.8/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.8/_static/img/icons/icon-careers.svg b/branch-3.8/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.8/_static/img/icons/icon-chevron-left.svg b/branch-3.8/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.8/_static/img/icons/icon-chevron-right.svg b/branch-3.8/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.8/_static/img/icons/icon-circe.svg b/branch-3.8/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-clock.svg b/branch-3.8/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-close.svg b/branch-3.8/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-cloud-docs.svg b/branch-3.8/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-cloud.svg b/branch-3.8/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-comparison.svg b/branch-3.8/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.8/_static/img/icons/icon-contact-us.svg b/branch-3.8/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.8/_static/img/icons/icon-developers-blog.svg b/branch-3.8/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.8/_static/img/icons/icon-docs.svg b/branch-3.8/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.8/_static/img/icons/icon-enterprise-m.svg b/branch-3.8/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-enterprise.svg b/branch-3.8/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-events.svg b/branch-3.8/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.8/_static/img/icons/icon-exclamation.svg b/branch-3.8/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-expand.svg b/branch-3.8/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-forum.svg b/branch-3.8/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-getting-started.svg b/branch-3.8/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-glossary.svg b/branch-3.8/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-home.svg b/branch-3.8/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-infoworld.svg b/branch-3.8/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.8/_static/img/icons/icon-integrations.svg b/branch-3.8/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-knowledge-base.svg b/branch-3.8/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-less.svg b/branch-3.8/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-live-test.svg b/branch-3.8/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.8/_static/img/icons/icon-mail-list.svg b/branch-3.8/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-manager.svg b/branch-3.8/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.8/_static/img/icons/icon-memory-management.svg b/branch-3.8/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.8/_static/img/icons/icon-modeling.svg b/branch-3.8/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-monitoring.svg b/branch-3.8/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.8/_static/img/icons/icon-networking.svg b/branch-3.8/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.8/_static/img/icons/icon-news.svg b/branch-3.8/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.8/_static/img/icons/icon-newsletter.svg b/branch-3.8/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.8/_static/img/icons/icon-nsql-guides.svg b/branch-3.8/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.8/_static/img/icons/icon-open-source.svg b/branch-3.8/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.8/_static/img/icons/icon-operator.svg b/branch-3.8/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-overview.svg b/branch-3.8/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.8/_static/img/icons/icon-partners.svg b/branch-3.8/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.8/_static/img/icons/icon-plus.svg b/branch-3.8/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-pricing.svg b/branch-3.8/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.8/_static/img/icons/icon-release-notes.svg b/branch-3.8/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.8/_static/img/icons/icon-resource-center.svg b/branch-3.8/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.8/_static/img/icons/icon-roadmap.svg b/branch-3.8/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.8/_static/img/icons/icon-search.svg b/branch-3.8/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.8/_static/img/icons/icon-slack.svg b/branch-3.8/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-stack-overflow.svg b/branch-3.8/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.8/_static/img/icons/icon-summit.svg b/branch-3.8/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/icons/icon-support.svg b/branch-3.8/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.8/_static/img/icons/icon-tech-talks.svg b/branch-3.8/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.8/_static/img/icons/icon-testing.svg b/branch-3.8/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.8/_static/img/icons/icon-thumbs-down.svg b/branch-3.8/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-thumbs-up.svg b/branch-3.8/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.8/_static/img/icons/icon-tip.svg b/branch-3.8/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.8/_static/img/icons/icon-training.svg b/branch-3.8/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.8/_static/img/icons/icon-triangle-down.svg b/branch-3.8/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.8/_static/img/icons/icon-university.svg b/branch-3.8/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.8/_static/img/icons/icon-users-blog.svg b/branch-3.8/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.8/_static/img/icons/icon-warning.svg b/branch-3.8/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.8/_static/img/icons/icon-webinars.svg b/branch-3.8/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.8/_static/img/icons/icon-whitepapers.svg b/branch-3.8/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.8/_static/img/icons/icon-workshop.svg b/branch-3.8/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.8/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.8/_static/img/logo-docs.svg b/branch-3.8/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.8/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.8/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.8/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.8/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.8/_static/img/mascots/404.jpg b/branch-3.8/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.8/_static/img/mascots/404.jpg differ diff --git a/branch-3.8/_static/img/mascots/scylla-3monsters.png b/branch-3.8/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.8/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-alternator.svg b/branch-3.8/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.8/_static/img/mascots/scylla-cloud.svg b/branch-3.8/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.8/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.8/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-computer-headset.png b/branch-3.8/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-cup-number-one.png b/branch-3.8/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-docs.svg b/branch-3.8/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.8/_static/img/mascots/scylla-drivers.svg b/branch-3.8/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.8/_static/img/mascots/scylla-enterprise.svg b/branch-3.8/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.8/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.8/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-forklift-migration.png b/branch-3.8/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-gear.png b/branch-3.8/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-hardhat.png b/branch-3.8/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-headband.png b/branch-3.8/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-headset.png b/branch-3.8/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-hearts.png b/branch-3.8/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-looking-down.png b/branch-3.8/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-looking-up.png b/branch-3.8/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.8/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.8/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-manager.svg b/branch-3.8/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.8/_static/img/mascots/scylla-monitor.svg b/branch-3.8/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.8/_static/img/mascots/scylla-movement-fast.png b/branch-3.8/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-movement.png b/branch-3.8/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-onpremise.png b/branch-3.8/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-opensource.svg b/branch-3.8/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.8/_static/img/mascots/scylla-operator.svg b/branch-3.8/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.8/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.8/_static/img/mascots/scylla-plugin.png b/branch-3.8/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-release-mascot.png b/branch-3.8/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-repair.png b/branch-3.8/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-server.png b/branch-3.8/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-sleeping.png b/branch-3.8/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-tall-measure.png b/branch-3.8/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-university.png b/branch-3.8/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-weights.png b/branch-3.8/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-window-cleaning.png b/branch-3.8/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-with-computer-2.png b/branch-3.8/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-with-computer.png b/branch-3.8/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-with-linux.png b/branch-3.8/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.8/_static/img/mascots/scylla-writting.png b/branch-3.8/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.8/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.8/_static/img/menu.svg b/branch-3.8/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.8/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.8/_static/img/scylla-monitor.png b/branch-3.8/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.8/_static/img/scylla-monitor.png differ diff --git a/branch-3.8/_static/js/main.bundle.js b/branch-3.8/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-3.8/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
            • Back
            • ',backButtonPosition:"top",wrapper:"
              ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                "],col:[2,"","
                "],tr:[2,"","
                "],td:[3,"","
                "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + + + +
                + + + + + +
                + + +
                + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/index.html b/branch-3.8/index.html new file mode 100644 index 000000000..a72f43deb --- /dev/null +++ b/branch-3.8/index.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack

                +
                +
                +

                Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                +_images/monitor.png +

                The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

                +
                  +
                • prometheus - collects and stores metrics

                • +
                • alertmanager - handles alerts

                • +
                • grafana - dashboard server

                • +
                +

                Choose a topic to get started:

                + +

                For older versions of Scylla Monitoring Stack Documentation see here.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/docker_compose.html b/branch-3.8/install/docker_compose.html new file mode 100644 index 000000000..685aeea02 --- /dev/null +++ b/branch-3.8/install/docker_compose.html @@ -0,0 +1,790 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Using Docker Compose

                +

                Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                +

                Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                +
                +

                Warning

                +

                docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                +
                +
                +

                Prerequisite

                +

                Make sure you have docker and docker-compose installed.

                +
                +
                +

                Setting Prometheus

                +

                The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                +

                You can use ./prometheus-config.sh to generate the file, for example:

                +
                ./prometheus-config.sh --compose
                +
                +
                +

                For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                +
                +
                +

                Setting Grafana Provisioning

                +

                Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                +
                +

                Grafana Data-Source file

                +

                Run the following command to update the datasource:

                +
                ./grafana-datasource.sh --compose
                +
                +
                +

                You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                +
                +
                +

                Grafana Dashboard Load file

                +

                To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                +
                ./generate-dashboards.sh -t -v 2020.1
                +
                +
                +

                This command generates the files under: grafana/provisioning/dashboards/

                +
                +
                +
                +

                Docker Compose file

                +

                You can use the following example as a base for your docker compose.

                +

                Pass the following to a file called docker-compose.yml

                +
                services:
                +  alertmanager:
                +    container_name: aalert
                +    image: prom/alertmanager:v0.21.0
                +    ports:
                +    - 9093:9093
                +    volumes:
                +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                +  grafana:
                +    container_name: agraf
                +    environment:
                +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                +    # This is where you set Grafana security
                +    - GF_AUTH_BASIC_ENABLED=false
                +    - GF_AUTH_ANONYMOUS_ENABLED=true
                +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                +    - GF_SECURITY_ADMIN_PASSWORD=admin
                +    image: grafana/grafana:7.3.5
                +    ports:
                +    - 3000:3000
                +    user: 1000:1000
                +    volumes:
                +    - ./grafana/build:/var/lib/grafana/dashboards
                +    - ./grafana/plugins:/var/lib/grafana/plugins
                +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                +    # Uncomment the following line for grafana persistency
                +    # - path/to/grafana/dir:/var/lib/grafana
                +  loki:
                +    command:
                +    - --config.file=/mnt/config/loki-config.yaml
                +    container_name: loki
                +    image: grafana/loki:2.0.0
                +    ports:
                +    - 3100:3100
                +    volumes:
                +    - ./loki/rules:/etc/loki/rules
                +    - ./loki/conf:/mnt/config
                +  promotheus:
                +    command:
                +    - --config.file=/etc/prometheus/prometheus.compose.yml
                +    container_name: aprom
                +    image: prom/prometheus:v2.18.1
                +    ports:
                +    - 9090:9090
                +    volumes:
                +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                +    # Uncomment the following line for prometheus persistency 
                +    # - path/to/data/dir:/prometheus/data
                +  promtail:
                +    command:
                +    - --config.file=/etc/promtail/config.yml
                +    container_name: promtail
                +    image: grafana/promtail:2.0.0
                +    ports:
                +    - 1514:1514
                +    - 9080:9080
                +    volumes:
                +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                +version: '3'
                +
                +
                +
                +

                Start and Stop

                +

                To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/index.html b/branch-3.8/install/index.html new file mode 100644 index 000000000..e3725d569 --- /dev/null +++ b/branch-3.8/install/index.html @@ -0,0 +1,649 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Download and Install Scylla Monitoring Stack

                +
                +
                +

                Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                +

                Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/min-prod-hw.html b/branch-3.8/install/min-prod-hw.html new file mode 100644 index 000000000..b2cb3d7f2 --- /dev/null +++ b/branch-3.8/install/min-prod-hw.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Minimal Production System Recommendations

                +
                  +
                • CPU - at least 2 physical cores/ 4vCPUs

                • +
                • Memory - 15GB+ DRAM

                • +
                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                • +
                • Network - 1GbE/10GbE preferred

                • +
                +
                +

                Calculating Prometheus Minimal Disk Space requirement

                +

                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                +

                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

                +

                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

                +
                6 * 16 * 200MB ~ 20GB
                +
                +
                +

                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/monitor_without_docker.html b/branch-3.8/install/monitor_without_docker.html new file mode 100644 index 000000000..da4abef3f --- /dev/null +++ b/branch-3.8/install/monitor_without_docker.html @@ -0,0 +1,1034 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Deploying Scylla Monitoring Stack Without Docker

                +
                +

                Introduction

                +

                The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                +

                Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                +

                Scylla Monitoring uses the following components:

                +
                  +
                • Alertmanager

                • +
                • Grafana Loki

                • +
                • Prometheus

                • +
                • Grafana

                • +
                +

                The common scenario for users who use their own standalone installation, is they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                +

                We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                +
                +
                +

                Minimal Production System Recommendations

                +
                  +
                • CPU - at least 2 physical cores/ 4vCPUs

                • +
                • Memory - 15GB+ DRAM

                • +
                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                • +
                • Network - 1GbE/10GbE preferred

                • +
                +
                +

                Calculating Prometheus Minimal Disk Space requirement

                +

                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                +

                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

                +

                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

                +
                6 * 16 * 200MB ~ 20GB
                +
                +
                +

                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                +

                The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                +
                +

                Note

                +

                Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                +
                +
                +
                +
                +

                Install Scylla Monitoring Stack

                +

                The following procedure uses a CentOS 7 based instance

                +
                  +
                1. Download the latest Scylla Monitoring Stack release.

                2. +
                +

                wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.8.0.tar.gz

                +
                  +
                1. Open the tar

                2. +
                +

                tar -xvf scylla-monitoring-*.tar.gz

                +
                +
                +

                Install Alertmanager

                +

                Tested with alertmanager 0.22.2 version

                +
                  +
                1. Install alertmanager

                2. +
                +
                wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                +tar -xvf alertmanager-*.linux-amd64.tar.gz
                +
                +
                +
                  +
                1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.5/prometheus directory to alertmanager.yml in the alertmanager installation directory.

                2. +
                +

                For example:

                +
                cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.8.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                +
                +
                +
                  +
                1. Start the Alertmanager

                2. +
                +

                For example:

                +
                cd alertmanager-0.22.2.linux-amd64
                +./alertmanager
                +
                +
                +
                  +
                1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                2. +
                +

                For example:

                +
                http://192.168.135.166:9093/
                +
                +
                +../_images/alertmanager.png +
                +
                +

                Install Grafana Loki

                +

                Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                +

                We recomand using Loki with containers, but you can install it locally as described in Loki installation

                +

                You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                +

                Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                +

                Loki Related files

                +

                Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                +
                mkdir -p /etc/loki/rules
                +mkdir -p /etc/loki/config
                +cp loki/rules/* /etc/loki/rules
                +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                +
                +
                +

                Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                +

                Promtail Related files

                +

                Promtail has a configuration file. You need to copy and modify the configuration.

                +
                mkdir -p /etc/promtail/
                +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                +
                +
                +

                Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                +
                +
                +

                Install Prometheus

                +

                Tested with Prometheus version 2.27.1

                +
                +

                Note

                +

                If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                +
                +
                  +
                1. Install Prometheus

                2. +
                +
                wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                +tar -xvf prometheus-*.linux-amd64.tar.gz
                +
                +
                +

                2. Create Data and Config directories +.. code-block:: shell

                +
                +

                mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                +
                +
                  +
                1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.7.0/prometheus directory to Prometheus installation directory.

                2. +
                +

                Copy prometheus/prometheus.yml.template to prometheus.yml

                +

                For example:

                +
                cp scylla-monitoring-scylla-monitoring-3.7.0/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
                +cp scylla-monitoring-scylla-monitoring-3.7.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                +
                +
                +
                  +
                1. Edit the prometheus.yml file to point to the correct static data sources.

                2. +
                +
                +

                Note

                +

                Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                +
                +
                vi /etc/prometheus/prometheus.yml
                +
                +
                +

                Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                +

                For example if the alertmanager will run on the same host:

                +
                alerting:
                +   alertmanagers:
                +   - static_configs:
                +       - targets:
                +           - 127.0.0.1:9093
                +
                +
                +

                Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                +

                For example the scrape config for Scylla:

                +
                global:
                +  scrape_interval: 5s # By default, scrape targets every 5 second.
                +  scrape_timeout: 4s # Timeout before trying to scape a target again
                +
                +  # Attach these labels to any time series or alerts when communicating with
                +  # external systems (federation, remote storage, Alertmanager).
                +  external_labels:
                +    monitor: 'scylla-monitor'
                +
                +scrape_configs:
                +- job_name: scylla
                +  honor_labels: false
                +  file_sd_configs:
                +    - files:
                +      - /etc/scylla.d/prometheus/scylla_servers.yml
                +  relabel_configs:
                +    - source_labels: [__address__]
                +      regex:  '([^:]+)'
                +      target_label: __address__
                +      replacement: '${1}:9180'
                +
                +    - source_labels: [__address__]
                +      regex:  '(.*):.+'
                +      target_label: instance
                +      replacement: '${1}'
                +
                +
                +
                  +
                1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                2. +
                +
                +

                Note

                +

                There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                +
                +

                An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                +
                +

                Note

                +

                You must have both files even if you are not using Scylla Manager

                +
                +

                Add the labels for the cluster and data-center

                +

                scylla_servers.yml:

                +

                For example:

                +
                cat scylla_servers.yml
                +# List Scylla end points
                +
                +- targets:
                +  - 192.168.66.6
                +  - 192.168.66.244
                +  labels:
                +    cluster: cluster1
                +    dc: dc1
                +- targets:
                +    - 172.17.0.3
                +  labels:
                +    cluster: cluster1
                +    dc: dc2
                +
                +
                +
                +

                Note

                +

                See the previous note about deprecating the node_exporter_servers.yml file.

                +
                +

                scylla_manager_server.yml

                +

                For example:

                +
                - targets:
                +  - 127.0.0.1:5090
                +
                +
                +
                  +
                1. Start Prometheus server:

                2. +
                +

                For example:

                +
                cd scylla-monitoring-scylla-monitoring-3.7.0/
                +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                +
                +
                +

                Data should start accumulate on: /prometheus/data

                +
                  +
                1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                2. +
                +

                For example:

                +
                http://192.168.135.166:9090/
                +
                +
                +../_images/1.png +

                Prometheus console should be visible

                +
                  +
                1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                2. +
                +

                For example:

                +

                node_memory_MemFree

                +../_images/2.png +

                And

                +

                scylla_reactor_utilization

                +../_images/3.png +

                At this point Scylla is emitting the metrics and Prometheus is able to store them.

                +
                +
                +

                Install Grafana

                +

                Tested with Grafna 7.5.7

                +
                  +
                1. Install Grafana based on the instructions here

                2. +
                +

                Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                +
                  +
                1. Access Scylla-Grafana-monitoring directory

                2. +
                +

                cd scylla-monitoring-scylla-monitoring-3.7.0/

                +
                  +
                1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                2. +
                +
                sudo cp -r grafana/plugins /var/lib/grafana/
                +
                +
                +

                If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                +

                For example:

                +
                cp -r grafana/plugins ../grafana-7.5.7/public/app
                +
                +
                +
                  +
                1. Provision the Dashboards

                2. +
                +

                For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                +

                For Grafana installed with yum install

                +
                sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                +sudo mkdir -p /var/lib/grafana/dashboards
                +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                +
                +
                +

                For Grafana installed from packages

                +
                cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                +
                +
                +

                Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                +
                +

                Note

                +

                A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                +
                +
                  +
                1. Set the data source by copy datasource.yml and edit it

                2. +
                +
                sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                +
                +
                +

                For Grafana installed from packages

                +
                cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                +
                +
                +

                You should set the Prometheus and the alertmanager IP and port.

                +

                For example

                +
                sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                +apiVersion: 1
                +datasources:
                + - name: prometheus
                +   type: prometheus
                +   url: http://192.168.135.167:9090
                +   access: proxy
                +   basicAuth: false
                +
                + - name: alertmanager
                +   type: camptocamp-prometheus-alertmanager-datasource
                +   orgId: 1
                +   typeLogoUrl: public/img/icn-datasource.svg
                +   access: proxy
                +   url: http://192.168.135.166:9093
                +   password:
                +   user:
                +   database:
                +   basicAuth:
                +   isDefault:
                +   jsonData:
                +     severity_critical: '4'
                +     severity_high: '3'
                +     severity_warning: '2'
                +     severity_info: '1'
                +
                +
                +
                  +
                1. Start the Grafana service

                2. +
                +

                For Grafana installed with yum install

                +

                sudo service grafana-server start

                +

                For Grafana installed from packages:

                +

                cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                +

                Edit scylla.ini to reflect the right paths in the paths section of the file.

                +
                plugins = /home/centos/grafana-7.5.7/data/plugins
                +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                +
                +
                +

                Start the server:

                +
                cd /home/centos/grafana-7.5.7/
                +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                +
                +
                +
                  +
                1. Make sure Grafana is running

                2. +
                +

                Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                +../_images/grafana.png +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/monitoring_stack.html b/branch-3.8/install/monitoring_stack.html new file mode 100644 index 000000000..398f04977 --- /dev/null +++ b/branch-3.8/install/monitoring_stack.html @@ -0,0 +1,1018 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Install Scylla Monitoring Stack

                + +

                This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

                +

                The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                +

                For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                +
                +

                Minimal Production System Recommendations

                +
                  +
                • CPU - at least 2 physical cores/ 4vCPUs

                • +
                • Memory - 15GB+ DRAM

                • +
                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                • +
                • Network - 1GbE/10GbE preferred

                • +
                +
                +

                Calculating Prometheus Minimal Disk Space requirement

                +

                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                +

                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 200MB per core, assuming the default scraping interval of 15s.

                +

                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores, and using the default 15 days retention time, you will need minimal disk space of

                +
                6 * 16 * 200MB ~ 20GB
                +
                +
                +

                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x4-5 space, in this case, ~100GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                +
                +
                +
                +

                Prerequisites

                +
                  +
                • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

                • +
                • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                • +
                + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                Scylla Monitoring Stack Compatibility Matrix

                Scylla Monitoring Stack Version

                Prometheus Version

                Grafana Version

                3.8

                2.27.1

                7.5.7

                3.7

                2.25.2

                7.4.0

                3.6

                2.18.1

                7.3.5

                3.5

                2.18.1

                7.1.5

                3.4

                2.18.1

                6.7.3

                +
                +
                +

                Docker Post Installation

                +

                Docker post installation guide can be found here

                +
                +

                Note

                +

                Avoid running the container as root.

                +
                +

                To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                +
                  +
                1. Create the Docker group.

                2. +
                +
                sudo groupadd docker
                +
                +
                +
                  +
                1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                2. +
                +
                sudo usermod -aG docker $USER
                +
                +
                +
                  +
                1. Start Docker by calling:

                2. +
                +
                sudo systemctl enable docker
                +
                +
                +
                +
                +

                Install Scylla Monitoring Stack

                +

                Procedure

                +
                  +
                1. Download and extract the latest Scylla Monitoring Stack binary;.

                2. +
                +
                wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.8.2.tar.gz
                +tar -xvf scylla-monitoring-3.8.2.tar.gz
                +cd scylla-monitoring-scylla-monitoring-3.8.2
                +
                +
                +

                As an alternative, you can clone and use the Git repository directly.

                +
                git clone https://github.com/scylladb/scylla-monitoring.git
                +cd scylla-monitoring
                +git checkout branch-3.8
                +
                +
                +
                  +
                1. Start Docker service if needed

                2. +
                +
                sudo systemctl restart docker
                +
                +
                +
                +
                +

                Configure Scylla Monitoring Stack

                +

                To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                +

                This configuration can be done from files, or using the Consul api.

                +

                Scylla Manager 2.0 and higher supports the Consul API.

                +
                +

                Configure Scylla nodes from files

                +
                  +
                1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                2. +
                +
                +

                Note

                +

                It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                +
                +

                For example:

                +
                - targets:
                +      - 172.17.0.2
                +      - 172.17.0.3
                +  labels:
                +      cluster: cluster1
                +      dc: dc1
                +
                +
                +
                +

                Note

                +

                If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                +
                +

                Using IPV6

                +

                To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                +

                For example:

                +
                - targets:
                +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                +  labels:
                +      cluster: cluster1
                +      dc: dc1
                +
                +
                +
                +

                Note

                +

                For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                +
                +

                For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                +
                +

                Note

                +

                By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                +
                +

                If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                +

                For example:

                +
                ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                +
                +
                +

                Mark the different Data Centers with Labels.

                +

                As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                +

                You can use the genconfig.py script to generate the server file. For example:

                +
                ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                +
                +
                +

                This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                +

                OR

                +

                The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                +
                nodetool status | ./genconfig.py -NS
                +
                +
                +

                2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                +

                You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                +

                For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                +
                # List Scylla Manager end points
                +
                +- targets:
                +  - 172.17.0.7:5090
                +
                +
                +

                Note that you do not need to add labels to the Scylla Manager targets.

                +
                +
                +

                Configure Scylla nodes using Scylla-Manager Consul API

                +

                Scylla Manager 2.0 has a Consul like API.

                +

                When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                +

                For example:

                +
                ./start-all.sh -L 10.10.0.1
                +
                +
                +
                +

                Note

                +

                If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                +
                +
                +
                +

                Connecting Scylla-Monitoring to Scylla

                +

                Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                +

                You can limit the user to read only, currently it only read table from the system keyspace.

                +

                To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                +

                Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                +
                +
                +

                Use an external directory for the Prometheus data directory

                +

                The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                +
                +

                Note

                +

                Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                +
                +

                If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                +

                In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                +
                +
                +

                Add Additional Prometheus Targets

                +

                There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                +

                The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                +

                You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                +
                - job_name: 'myservice'
                +  # Override the global default and scrape targets from this job every 5 seconds.
                +  scrape_interval: 5s
                +  static_configs:
                +    - targets:
                +      - 17.0.0.1:7000
                +
                +
                +
                +
                +
                +

                Start and Stop Scylla Monitoring Stack

                +
                +

                Start

                +
                ./start-all.sh -d prometheus_data
                +
                +
                +
                +
                +

                Stop

                +
                ./kill-all.sh
                +
                +
                +
                +
                +

                Start a Specific Scylla Monitoring Stack Version

                +

                By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                +

                You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                +

                Multiple versions are supported. For example:

                +
                ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                +
                +
                +

                will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                +
                +
                +

                Accessing the localhost

                +

                The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                +
                ./start-all.sh -l -d prometheus-data
                +
                +
                +
                +
                +

                Configure rsyslog on each Scylla node

                +

                generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                +

                Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                +

                Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                +

                If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                +
                if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                +
                +
                +

                Restart rsyslog for the configuration to take effect.

                +
                systemctl restart rsyslog
                +
                +
                +
                +
                +
                +

                View Grafana Dashboards

                +

                Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/start_all.html b/branch-3.8/install/start_all.html new file mode 100644 index 000000000..bec47b348 --- /dev/null +++ b/branch-3.8/install/start_all.html @@ -0,0 +1,730 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                The start-all.sh command

                +

                Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

                +

                The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                +
                +

                General Options

                +

                -h Help, Print the help, and exit.

                +

                –version print the current Scylla-Monitoring stack version, and exit.

                +

                -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

                +

                -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                +

                -D encapsulate docker param Allows passing additional parameters to all the docker containers.

                +

                –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                +
                + + +
                +

                Alert Manager

                +

                alertmanager handles the alerts and takes the following parameters:

                +

                -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                +

                -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                +

                -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/install/thanos.html b/branch-3.8/install/thanos.html new file mode 100644 index 000000000..660d4e063 --- /dev/null +++ b/branch-3.8/install/thanos.html @@ -0,0 +1,733 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Using Thanos as Data Source With Scylla Monitoring Stack

                +

                Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as:

                +
                  +
                • High-availability.

                • +
                • Horizontal scaling.

                • +
                • Backup.

                • +
                +

                The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                +

                The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                +
                +

                Using Thanos As a Prometheus Aggregator

                +

                There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                +
                +

                Prometheus Configuration

                +

                We will assume you have two Prometheus servers running.

                +
                  +
                1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                2. +
                3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                4. +
                +
                +
                +

                Thanos sidecar

                +

                The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                +
                docker run -d \
                + -v /path/to/prom/dir:/data/prom:z \
                + -i --name sidecar thanosio/thanos \
                + sidecar \
                + --grpc-address=0.0.0.0:10911 \
                + --grpc-grace-period=1s \
                + --http-address=0.0.0.0:10912 \
                + --http-grace-period=1s \
                + --prometheus.url=http://prometheus-ip:9090 \
                + --tsdb.path=/data/prom \
                + -p 10912:10912 \
                + -p 10911:10911
                +
                +
                +

                After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                +
                +
                +

                Thanos query

                +

                Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                +
                docker run -d \
                + --name thanos -- thanosio/thanos \
                +   query \
                +   --debug.name=query0 \
                +   --log.level=debug \
                +   --grpc-address=0.0.0.0:10903 \
                +   --grpc-grace-period=1s \
                +   --http-address=0.0.0.0:10904 \
                +   --http-grace-period=1s \
                +   --query.replica-label=prometheus \
                +   --store={ip1}:10911 --store={ip2}:10911
                +
                +
                +

                After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                +
                +
                +

                Update Scylla Data source

                +

                The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                +

                The file you edit is a template file that replaces the file Grafana uses, next time you start.

                +

                Restart the Scylla Monitoring Stack it should now use Thanos.

                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/objects.inv b/branch-3.8/objects.inv new file mode 100644 index 000000000..aaa23034f Binary files /dev/null and b/branch-3.8/objects.inv differ diff --git a/branch-3.8/procedures/alerts/alerting.html b/branch-3.8/procedures/alerts/alerting.html new file mode 100644 index 000000000..cb29b7355 --- /dev/null +++ b/branch-3.8/procedures/alerts/alerting.html @@ -0,0 +1,729 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Alerting

                +

                Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                +

                You can read more about Prometheus alerting here

                +

                By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                +

                In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                +

                The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                +../../_images/monitoring_stack.png +
                +

                Prometheus Alerts

                +

                The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                +

                Each alert consists of:

                +
                  +
                • Name

                • +
                • What happened

                • +
                • For how long

                • +
                • What to report

                • +
                +

                For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                +
                - alert: InstanceDown
                +  expr: up == 0
                +  for: 60s
                +  labels:
                +    severity: "2"
                +  annotations:
                +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                +    summary: Instance {{ $labels.instance }} down
                +
                +
                +

                The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                +

                The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                +

                The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                +

                annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                +
                +
                +

                Alertmanager

                +

                The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                +

                The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                +
                  +
                • Routes: Represent a routing tree, the most specific rule, wins

                • +
                • Inhibition: Mute an alert, based on another alert

                • +
                • Receiver: Send a notification via email, sluck, etc’

                • +
                +

                Check the Alertmanager documentation for details on how to specify a specific receiver.

                +

                In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                +
                +
                +

                Tips When Adding an Alert

                +

                It’s worse having an alert that does not work, than not having an alert at all

                +

                There are multiple ways you can use to make sure your alert is set correctly:

                +
                  +
                • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                • +
                • Force the alert to be active by reducing the limits or the duration.

                • +
                • When possible simulate the actual scenario and see that the alert works as expected.

                • +
                +

                For example, low available disk space.

                +

                Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                +

                Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                +

                Starting with a simple working expression helps you bisect problems.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/procedures/alerts/index.html b/branch-3.8/procedures/alerts/index.html new file mode 100644 index 000000000..bb51acce9 --- /dev/null +++ b/branch-3.8/procedures/alerts/index.html @@ -0,0 +1,651 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Alert Manager

                +
                +
                +

                Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/procedures/index.html b/branch-3.8/procedures/index.html new file mode 100644 index 000000000..f8686e49d --- /dev/null +++ b/branch-3.8/procedures/index.html @@ -0,0 +1,646 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Procedures

                +
                +
                +

                There are several reference guides available which give additional information. Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/procedures/updating_dashboard.html b/branch-3.8/procedures/updating_dashboard.html new file mode 100644 index 000000000..bcfdd263f --- /dev/null +++ b/branch-3.8/procedures/updating_dashboard.html @@ -0,0 +1,939 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Adding and Modifying Dashboards

                +

                The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                +

                It will explain about Scylla Monitoring Stack dashboard templates and how to modify them.

                + +
                +

                General Limitations

                +

                Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

                +
                +

                consistency between restarts

                +

                By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

                +
                +
                +

                consistency between upgrades

                +

                As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                +
                +

                Note

                +

                 You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

                +
                +

                At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

                +
                +
                +
                +

                Using templated Dashboards

                +

                Why does Scylla Monitor use dashboard templates?

                +

                We found the Grafana dashboards Json format too verbose to be maintainable.

                +

                Each element in the dashboard file (Each Json object) contains all of its attributes and values.

                +

                For example a typical graph panel would look like:

                +
                {
                +    "aliasColors": {},
                +    "bars": false,
                +    "datasource": "prometheus",
                +    "editable": true,
                +    "error": false,
                +    "fill": 0,
                +    "grid": {
                +        "threshold1": null,
                +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                +        "threshold2": null,
                +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                +    },
                +    "gridPos": {
                +        "h": 6,
                +        "w": 10,
                +        "x": 0,
                +        "y": 4
                +    },
                +    "id": 2,
                +    "isNew": true,
                +    "legend": {
                +        "avg": false,
                +        "current": false,
                +        "max": false,
                +        "min": false,
                +        "show": false,
                +        "total": false,
                +        "values": false
                +    },
                +    "lines": true,
                +    "linewidth": 2,
                +    "links": [],
                +    "nullPointMode": "connected",
                +    "percentage": false,
                +    "pointradius": 5,
                +    "points": false,
                +    "renderer": "flot",
                +    "seriesOverrides": [
                +        {}
                +    ],
                +    "span": 5,
                +    "stack": false,
                +    "steppedLine": false,
                +    "targets": [
                +        {
                +            "expr": "sum(node_filesystem_avail) by (instance)",
                +            "intervalFactor": 1,
                +            "legendFormat": "",
                +            "refId": "A",
                +            "step": 1
                +        }
                +    ],
                +    "timeFrom": null,
                +    "timeShift": null,
                +    "title": "Available Disk Size",
                +    "tooltip": {
                +        "msResolution": false,
                +        "shared": true,
                +        "sort": 0,
                +        "value_type": "cumulative"
                +    },
                +    "transparent": false,
                +    "type": "graph",
                +    "xaxis": {
                +        "show": true
                +    },
                +    "yaxes": [
                +        {
                +            "format": "percent",
                +            "logBase": 1,
                +            "max": 101,
                +            "min": 0,
                +            "show": true
                +        },
                +        {
                +            "format": "short",
                +            "logBase": 1,
                +            "max": null,
                +            "min": null,
                +            "show": true
                +        }
                +    ]
                +}
                +
                +
                +

                As you can imagine, most panels would have similar values.

                +

                To reduce the redundancy of Grafana JSON format, we added dashboard templates.

                +
                +

                The template class system

                +

                Scylla Monitoring Stack dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                +

                The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

                +

                In the template file, you can also add or override attributes.

                +

                The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                +

                When generating dashboards, each class will be replaced by its definition.

                +

                For example row in the type.json defined

                +
                {
                + "base_row": {
                +     "collapse": false,
                +     "editable": true
                + },
                + "row": {
                +     "class": "base_row",
                +     "height": "250px"
                + }
                + }
                +
                +
                +

                In a Template it will be used like

                +
                {
                +     "class": "row",
                +     "height": "150px",
                +     "panels": [
                +     ]
                +}
                +
                +
                +

                The output will be

                +
                {
                +     "class": "row",
                +     "collapse": false,
                +     "editable": true,
                +     "height": "150px",
                +     "panels": [
                +
                +     ]
                +}
                +
                +
                +

                We can see that the template added the panels attribute and override the height attribute.

                +
                +
                +

                Panel example

                +

                Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                +
                {
                +     "class": "row",
                +     "panels": [
                +         {
                +             "class": "bytes_panel",
                +             "span": 3,
                +             "targets": [
                +                 {
                +                     "expr": "sum(node_filesystem_avail) by (instance)",
                +                     "intervalFactor": 1,
                +                     "legendFormat": "",
                +                     "metric": "",
                +                     "refId": "A",
                +                     "step": 1
                +                 }
                +             ],
                +             "title": "Available Disk Size"
                +         }
                +     ]
                +}
                +
                +
                +

                In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

                +

                You can also see that we override the span attribute to set the panel size.

                +

                To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                +
                +
                +

                Grafana Formats and Layouts

                +

                The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                +

                Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

                +

                The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                +

                To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                +

                The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                +

                you can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                +

                gridPos has the following attributes:

                +
                {
                +   "x": 0,
                +   "y": 0,
                +   "w": 24,
                +   "h": 4
                + }
                +
                +
                +

                When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                +
                {
                +   "gridPos": {
                +      "h": 2
                +    }
                +}
                +
                +
                +
                +
                +

                Generating the dashboards from templates (generate-dashboards.sh)

                +
                +

                Prerequisite

                +

                Python 2.7

                +

                make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                +

                Use the -h flag to get help information.

                +

                You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                +

                When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                +

                For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                +

                .\generate-dashboards.sh -v 2020.1

                +
                +

                Note

                +

                generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

                +
                +
                +
                +
                +

                Validation

                +

                After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

                +

                Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/reference/index.html b/branch-3.8/reference/index.html new file mode 100644 index 000000000..e1c8b4f88 --- /dev/null +++ b/branch-3.8/reference/index.html @@ -0,0 +1,645 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Reference Guide

                +
                +
                +

                There are several reference guides available which give additional information. Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/reference/matrix.html b/branch-3.8/reference/matrix.html new file mode 100644 index 000000000..7ac8fcce0 --- /dev/null +++ b/branch-3.8/reference/matrix.html @@ -0,0 +1,768 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Support Matrix

                +

                The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                Scylla Monitoring Stack Version

                Scylla Open Source Version

                Scylla Enterprise Version

                Node_exporter[1] Version

                Scylla Manager Version

                3.8

                4.3, 4.4, 4.5

                2020.1, 2021.1

                0.17

                2.3, 2.4

                3.7

                4.2, 4.3, 4.4

                2019.1, 2020.1, 2021.1

                0.17

                2.2, 2.3

                3.6.3

                4.2, 4.3, 4.4

                2019.1, 2020.1, 2021.1

                0.17

                2.2, 2.3, 2.1

                3.6

                4.1, 4.2, 4.3

                2019.1, 2020.1

                0.17

                2.1, 2.2, 2.3

                3.6.1

                4.1, 4.2, 4.3

                2019.1, 2020.1

                0.17

                2.1, 2.2

                3.6.1

                4.1, 4.2, 4.3, 4.4

                2019.1, 2020.1

                0.17

                2.1, 2.2

                3.5

                3.3, 4.0, 4.1, 4.2

                2019.1, 2020.1

                0.17

                2.0, 2.1, 2.2

                3.4.3

                3.3, 4.0, 4.1, 4.2

                2019.1, 2020.1

                0.17

                2.0, 2.1

                3.4

                3.3, 4.0, 4.1

                2018.1, 2019.1

                0.17

                2.0, 2.1

                3.3

                3.1, 3.2, 3.3, 4.0

                2018.1, 2019.1

                0.17

                1.4, 2.0, 2.1

                3.2

                3.1, 3.2, 3.3

                2018.1, 2019.1

                0.17

                1.4, 2.0

                3.1

                2.3, 3.0, 3.1, 3.2

                2018.1, 2019.1

                0.17

                1.3, 1.4, 2.0

                3.0

                2.3, 3.0, 3.1, 3.2

                2018.1, 2019.1

                0.17

                1.3, 1.4

                2.4

                2.3, 3.0, 3.1

                2018.1, 2019.1

                0.14, 0.17

                1.3, 1.4

                2.3

                2.3, 3.0

                2018.1, 2019.1

                0.14, 0.17

                1.3

                2.2

                2.3, 3.0

                2018.1, 2019.1

                0.14, 0.17

                1.3

                2.1

                2.3, 3.0

                2018.1

                0.14, 0.17

                1.3

                +

                [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/reference/monitoring_apis.html b/branch-3.8/reference/monitoring_apis.html new file mode 100644 index 000000000..5a29f337f --- /dev/null +++ b/branch-3.8/reference/monitoring_apis.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Interfaces

                +

                Scylla exposes two interfaces for online monitoring, as described below

                +
                +

                Prometheus

                +

                By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                +

                For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

                +

                You can change the Prometheus listening address and port in scylla.yaml file

                +
                # prometheus port
                +# By default, Scylla opens prometheus API port on port 9180
                +# setting the port to 0 will disable the prometheus API.
                +prometheus_port: 9180
                +#
                +# prometheus address
                +# By default, Scylla binds all interfaces to the prometheus API
                +# It is possible to restrict the listening address to a specific one
                +prometheus_address: 0.0.0.0
                +
                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/robots.txt b/branch-3.8/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.8/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.8/search.html b/branch-3.8/search.html new file mode 100644 index 000000000..5daf27776 --- /dev/null +++ b/branch-3.8/search.html @@ -0,0 +1,623 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + + + +
                + + + + + +
                + + +
                + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/searchindex.js b/branch-3.8/searchindex.js new file mode 100644 index 000000000..c1587bc90 --- /dev/null +++ b/branch-3.8/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], "8": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], "scylla": [0, 2, 4, 7, 9, 12, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31], "monitor": [0, 2, 4, 7, 9, 12, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31], "stack": [0, 2, 4, 7, 9, 12, 18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 31], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 17, 18, 19, 20, 21, 24, 25, 26, 28, 30, 31], "full": [0, 1, 3, 6, 9, 18], "alert": [0, 1, 3, 5, 6, 11], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 14, 17, 26, 28, 30], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 12, 21, 30, 31], "open": [0, 1, 3, 5, 6, 14, 15], "sourc": [0, 1, 3, 5, 6, 9, 14, 30], "tool": [0, 1, 3, 17, 31], "includ": [0, 1, 3, 5], "prometheu": [0, 1, 3, 10, 12, 14, 17, 31], "grafana": [0, 1, 3, 8, 9], "well": [0, 1, 3, 6], "custom": [0, 1, 3], "dashboard": [0, 1, 3, 5, 7, 9, 11, 14, 17, 25, 31, 32], "consist": [1, 9, 25], "three": [1, 6, 9], "compon": [1, 5], "wrap": 1, "docker": [1, 3, 7, 8, 17], "collect": [1, 5, 6, 7, 8, 26, 28], "store": [1, 5, 8, 12, 19, 20, 30], "metric": [1, 4, 5, 6, 7, 8, 9, 12, 14, 31], "alertmanag": [1, 2, 7], "handl": [1, 6, 7], "server": [1, 2, 5, 6, 7, 8, 9, 12, 15, 18, 31], "choos": [1, 3, 10, 11, 13, 16, 17, 32], "topic": [1, 3, 10, 11, 13, 16, 20, 32], "get": [1, 6, 8, 9, 12, 19, 25, 29, 30, 31], "start": [1, 3, 5, 8, 9, 12], "user": [1, 2, 5, 6, 7, 18, 31], "guid": [1, 6, 11, 17], "download": [1, 5, 6], "instal": [1, 2, 17], "procedur": [1, 5, 6, 17], "troubleshoot": [1, 24], "refer": [1, 6, 11], "lesson": [1, 20, 21], "univers": 1, "For": [1, 2, 4, 5, 6, 7, 9, 12, 15, 17, 25, 26, 29, 31], "older": 1, "version": [1, 2, 5, 7, 12, 14, 17], "document": [1, 5, 6, 8, 9, 12, 17], "see": [1, 2, 4, 5, 6, 9, 12, 15, 17, 31], "here": [1, 5, 6, 7, 9, 12], "base": [2, 5, 6, 7, 8, 9, 12, 18, 31], "you": [2, 4, 5, 6, 7, 8, 9, 10, 12, 15, 17, 21, 23, 25, 31, 32], "can": [2, 5, 6, 7, 8, 9, 12, 15, 17, 18, 21, 25, 31, 32], "all": [2, 3, 5, 6, 8, 9, 12, 15, 17, 18, 22, 25, 31], "sh": [2, 3, 6, 17], "kill": [2, 6, 17], "script": [2, 3, 6, 7, 12], "an": [2, 4, 5, 7, 8, 12, 17, 23, 24, 25, 26, 28, 30, 31], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 9, 12, 15], "requir": [2, 8, 19, 22, 26, 31], "more": [2, 6, 9, 12, 15, 17, 18, 21, 24, 26, 29, 31], "manual": [2, 17], "step": [2, 5, 8, 12, 17], "onc": [2, 23, 30, 31], "configur": [2, 5, 7, 9, 12, 15, 17, 25], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 17, 25, 26, 27, 30, 31, 32], "two": [2, 6, 7, 8, 15, 25, 30, 31], "wai": [2, 5, 7, 9, 17, 24, 31], "launch": 2, "should": [2, 5, 6, 8, 12, 17, 18, 19, 22, 23, 24, 29, 31], "one": [2, 6, 7, 15, 19, 21, 22, 25, 26, 31], "both": [2, 5, 6, 17, 31], "In": [2, 6, 9, 12, 17, 31], "particular": 2, "creat": [2, 5, 6, 7, 9, 12, 17, 18, 30, 31], "updat": [2, 5, 12, 17], "yml": [2, 5, 6, 7, 8, 9, 17, 31], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 17, 20, 25, 26, 31], "make": [2, 5, 6, 7, 8, 9, 12, 17, 25, 31], "sure": [2, 5, 6, 8, 9, 12, 17, 31], "have": [2, 4, 5, 6, 7, 8, 9, 12, 17], "among": [2, 25], "other": [2, 8, 9], "ip": [2, 5, 6, 7, 8, 15, 17], "address": [2, 5, 6, 7, 8, 15, 17], "either": [2, 6], "locat": [2, 7, 9, 25], "scylla_serv": [2, 5, 6, 17, 31], "consul": [2, 7], "manag": [2, 5, 11, 14, 16], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 31], "exampl": [2, 4, 5, 6, 7, 8, 9, 17, 25, 26, 31], "product": [2, 7], "system": [2, 7, 9, 10, 19, 25, 31], "advis": [2, 25], "extern": [2, 5, 7, 8, 9, 12, 17, 31], "directori": [2, 5, 7, 8, 9, 12], "databas": [2, 5, 7, 21, 31], "accordingli": 2, "below": [2, 6, 9, 15], "read": [2, 6, 8, 9, 17, 18, 22], "its": [2, 6, 7, 8, 12], "from": [2, 5, 7, 8, 9, 17, 18, 24, 27, 31], "note": [2, 5, 6, 7, 17], "latter": 2, "tell": 2, "where": [2, 5, 6, 12, 17, 31], "themselv": [2, 12], "which": [2, 8, 11, 12, 13, 14, 24, 26, 28, 30, 31], "differ": [2, 5, 6, 7, 8, 12, 23, 24, 31], "run": [2, 3, 5, 6, 7, 8, 12, 14, 17], "follow": [2, 4, 5, 6, 7, 12, 14, 17, 31], "command": [2, 6, 8, 17], "datasourc": [2, 5, 6, 8, 12], "under": [2, 5, 6], "yaml": [2, 5, 6, 15], "To": [2, 4, 5, 6, 12, 15], "sashboard": 2, "t": [2, 12], "line": [2, 6, 7, 8, 12], "flag": [2, 6, 7, 8, 12, 17], "v": [2, 6, 7, 8, 12, 17], "specifi": [2, 6, 7, 9, 12, 17], "enterpris": [2, 6, 12, 14], "2020": [2, 6, 12, 14], "1": [2, 5, 6, 7, 8, 12, 14], "thi": [2, 4, 5, 6, 7, 8, 9, 12, 17, 18, 19, 22, 25, 27, 31], "your": [2, 5, 6, 7, 8, 9, 10, 12, 15, 17, 19, 20, 21, 31], "pass": [2, 6, 7], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 17], "container_nam": 2, "aalert": 2, "imag": [2, 17], "prom": [2, 8, 17], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 9, 12, 14, 15], "port": [2, 5, 6, 7, 15, 17], "9093": [2, 5], "volum": [2, 4, 5, 6], "rule_config": [2, 5, 7, 9], "etc": [2, 5, 6, 7, 9, 12], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 12], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 20, 21, 22, 24, 26, 28, 29], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 12], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 12, 14], "5": [2, 4, 5, 6, 12, 14, 17], "3000": [2, 5, 6], "1000": 2, "build": [2, 5], "plugin": [2, 5], "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 20, 26, 28, 31], "path": [2, 5, 6, 7, 8, 9], "dir": [2, 7, 8], "loki": [2, 6], "mnt": 2, "3100": [2, 5], "rule": [2, 5, 7, 9, 23], "conf": [2, 5, 6], "promotheu": 2, "aprom": [2, 17], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 17], "d": [2, 5, 6, 7, 8], "scylla_manager_serv": [2, 5, 6, 17], "node_exporter_serv": [2, 5, 6], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 9, 17, 31], "down": [2, 9, 17, 19, 26], "begin": [3, 10, 11, 13, 16, 32], "deploi": [3, 6], "without": [3, 6, 7, 12], "us": [3, 4, 5, 7, 9, 10, 17, 21, 25, 26, 28, 30, 31], "compos": 3, "thano": 3, "cpu": [4, 5, 6], "least": [4, 5, 6], "physic": [4, 5, 6], "core": [4, 5, 6], "4vcpu": [4, 5, 6], "memori": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "storag": [4, 5, 6, 7, 12], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 26, 30], "retent": [4, 5, 6], "period": [4, 5, 6, 8, 9, 30], "section": [4, 5, 6, 17, 31], "network": [4, 5, 6, 7, 17], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 17], "perform": [4, 5, 6, 25, 29, 31], "block": [4, 5, 6], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 9, 21, 26, 28, 31], "default": [4, 5, 6, 7, 9, 12, 15, 17, 22, 31], "15": [4, 5, 6], "dai": [4, 5, 6, 7], "around": [4, 5, 6, 17], "200mb": [4, 5, 6], "per": [4, 5, 6, 8, 31], "assum": [4, 5, 6, 7, 8, 9], "scrape": [4, 5, 6], "interv": [4, 5, 6], "6": [4, 5, 6, 12, 14], "node": [4, 5, 7, 14, 17, 19, 20, 21, 25, 26, 28, 29, 31], "cluster": [4, 5, 6, 24, 31], "each": [4, 5, 7, 8, 9, 12, 14, 17, 19, 21, 25, 30, 31], "16": [4, 5, 6, 17], "time": [4, 5, 6, 7, 8, 9, 23, 30, 31], "need": [4, 5, 6, 7, 8, 12, 17, 19, 20, 21, 31], "20gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 12, 17, 27, 31], "replac": [4, 5, 6, 8, 12], "ad": [4, 5, 6, 7, 11], "we": [4, 5, 6, 8, 12, 31], "alloc": [4, 5, 6], "x4": [4, 5, 6], "case": [4, 5, 6, 7, 8, 9, 12, 17, 19, 31], "100gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 9, 12, 17, 30, 31], "fast": [4, 5, 6], "enough": [4, 5, 6], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 9, 12, 17, 19, 25, 31], "out": [4, 5, 6, 8], "box": [4, 5, 6, 8], "instruct": [5, 6], "help": [5, 7, 9, 12, 31], "pleas": [5, 17], "most": [5, 9, 12, 25, 27, 31], "current": [5, 6, 7, 9, 12, 17], "common": [5, 7, 31], "scenario": [5, 9], "who": 5, "own": [5, 6, 7, 17], "standalon": 5, "thei": [5, 7, 9, 29, 30], "alreadi": 5, "would": [5, 6, 8, 9, 12, 18, 21, 31], "consolid": 5, "add": [5, 7, 8, 9, 12, 15, 31], "componen": 5, "suggest": [5, 12], "those": 5, "offici": 5, "also": [5, 6, 7, 8, 9, 12], "main": [5, 30], "item": 5, "set": [5, 6, 7, 9, 12, 15], "avail": [5, 6, 8, 9, 11, 12, 13, 19, 20, 31], "data": [5, 7, 9, 12, 18, 19, 20, 21, 25, 26, 28, 29, 31], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 17], "befor": [5, 6, 9, 19, 20, 26, 31], "support": [5, 6, 12, 13, 18, 24, 31], "want": [5, 6, 9], "latest": [5, 6, 7], "releas": 5, "tightli": 5, "compat": [5, 12, 17], "matrix": [5, 13], "cento": [5, 17], "instanc": [5, 6, 9, 12], "wget": [5, 6], "http": [5, 6, 8, 17, 20, 21, 22, 24, 29], "github": [5, 6], "com": [5, 6, 20, 21, 22, 24, 29], "archiv": [5, 6], "ref": 5, "tag": 5, "tar": [5, 6], "gz": [5, 6], "xvf": [5, 6], "test": [5, 17, 31], "22": [5, 12], "linux": 5, "amd64": 5, "copi": 5, "file": [5, 7, 8, 9, 12, 15], "cp": 5, "p": [5, 7, 8, 17], "home": 5, "cd": [5, 6], "verifi": 5, "point": [5, 6, 12], "browser": [5, 6, 8, 12, 17], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 17], "aggreg": 5, "inspir": 5, "central": 5, "check": [5, 9, 17, 27, 28, 31], "recomand": 5, "local": [5, 6, 7, 8, 12, 17, 31], "describ": [5, 6, 8, 15, 17, 31], "respons": [5, 9], "pars": [5, 12, 23, 31], "act": [5, 6, 8, 9], "proemtheu": 5, "sent": [5, 9, 26, 28], "load": [5, 6, 17, 18, 21, 22, 31], "multipl": [5, 6, 7, 8, 9, 12, 19, 22, 23, 29, 31], "do": [5, 6, 7, 12, 17, 21, 31], "rsyslog": 5, "second": [5, 6, 9, 17], "relat": [5, 31], "modifi": [5, 11], "mkdir": 5, "templat": [5, 6, 8, 17, 31], "edit": [5, 6, 7, 8, 12, 17], "e": [5, 12], "localhost": [5, 7], "loki_ip": 5, "": [5, 6, 7, 9, 12, 18, 19, 27, 30, 31], "27": [5, 6, 12], "If": [5, 6, 7, 8, 12, 17, 27, 29, 30, 31], "besid": [5, 7, 31], "expect": [5, 9], "scrap": 5, "job": [5, 6, 17], "take": [5, 6, 7, 12, 17], "onli": [5, 6, 7, 21, 23, 30, 31], "import": [5, 6, 7], "record": 5, "asspect": 5, "work": [5, 6, 7, 8, 9, 12], "code": [5, 25], "shell": 5, "prom_rul": 5, "correct": 5, "static": 5, "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 24], "host": [5, 6, 7, 17], "static_config": [5, 6], "target": [5, 7, 12, 15, 17], "127": [5, 7, 17], "right": [5, 6, 12, 25, 31], "typic": [5, 12, 19, 21, 30, 31], "node_export": [5, 6, 7, 14, 17], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 9, 12, 15, 22, 31], "everi": [5, 6, 7], "scrape_timeout": 5, "4": [5, 6, 12, 14], "timeout": 5, "try": [5, 17], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 9], "ani": [5, 6, 9, 12, 17, 25, 31], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": 5, "scrape_config": 5, "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 15, 17], "There": [5, 6, 8, 9, 11, 12, 13, 29, 32], "instead": [5, 6, 8, 31], "found": [5, 6, 7, 9, 12], "must": [5, 6, 26], "even": [5, 6, 7], "center": [5, 6, 8, 31], "cat": 5, "list": [5, 6], "end": [5, 6, 31], "66": [5, 17], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8], "dc1": [5, 6], "172": [5, 6, 17], "17": [5, 6, 14, 17], "dc2": [5, 6], "previou": 5, "about": [5, 9, 12, 25], "deprec": 5, "5090": [5, 6, 17], "tsdb": [5, 7, 8], "accumul": 5, "consol": [5, 17], "visibl": 5, "execut": [5, 18, 23], "queri": [5, 25, 26, 28], "through": 5, "node_memory_memfre": 5, "And": 5, "scylla_reactor_util": 5, "At": [5, 12], "emit": 5, "abl": [5, 8], "them": [5, 7, 9, 12, 25], "grafna": 5, "depend": [5, 8], "repositori": [5, 6], "yum": 5, "zip": 5, "structur": 5, "rest": [5, 8], "access": [5, 7], "sudo": [5, 6, 17], "r": [5, 7, 12, 17], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 12, 17], "provis": [5, 6, 12], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 12, 19, 20, 26, 30, 31], "folder": 5, "name": [5, 6, 8, 9, 17, 31], "otherwis": 5, "apivers": 5, "type": [5, 12, 31], "url": [5, 8], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "setup": 6, "dedic": 6, "so": [6, 7, 8, 9, 12, 17, 21, 31], "pull": [6, 17], "over": 6, "evalu": 6, "laptop": 6, "tabl": [6, 9, 14, 18, 25, 31], "25": [6, 17], "avoid": [6, 12, 17, 22, 24, 31], "root": [6, 17], "go": [6, 17], "group": [6, 9], "groupadd": 6, "new": [6, 17, 30], "activ": [6, 9], "next": [6, 7, 8], "login": [6, 17], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 17], "extract": 6, "binari": [6, 17], "As": [6, 12, 23], "clone": 6, "git": 6, "directli": 6, "checkout": 6, "branch": 6, "restart": [6, 7, 8], "know": [6, 17, 21, 31], "done": [6, 7, 12, 17], "higher": [6, 21, 31], "wish": [6, 7], "match": [6, 31], "datacent": 6, "nodetool": 6, "statu": [6, 17], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8], "listen": [6, 7, 15], "inform": [6, 7, 11, 12, 13, 15, 18, 19, 20], "agent": [6, 7, 8, 14, 17], "machin": [6, 7, 17], "overrid": [6, 7, 12], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 12], "myconf": 6, "four": 6, "OR": 6, "look": [6, 8, 9, 12, 31], "l": [6, 7, 17], "10": [6, 9, 12], "within": [6, 9], "cql": [6, 25, 32], "protect": 6, "author": [6, 7], "assign": 6, "limit": [6, 8, 9, 22, 31], "keyspac": 6, "securejsondata": 6, "part": [6, 9, 18, 21, 25, 31], "place": [6, 7, 8, 12, 31], "outsid": [6, 7], "result": [6, 7, 19, 21, 22, 30, 31], "lost": [6, 7, 12, 31], "exist": [6, 12, 31], "permiss": 6, "somewher": 6, "els": [6, 7], "situat": [6, 7, 9, 31], "firewal": [6, 17], "7000": [6, 17], "myservic": 6, "m": [6, 7], "2019": [6, 14, 29], "reach": [6, 8, 21, 26, 31], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 9, 21, 22, 26, 28, 31], "than": [6, 9, 12, 31], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 12, 17], "authent": [6, 7], "disabl": [6, 15], "option": [6, 8, 17], "simplest": 7, "small": [7, 30], "util": [7, 12], "appropri": 7, "h": [7, 12], "print": 7, "exit": 7, "applic": 7, "becaus": [7, 17, 26], "cannot": [7, 26], "map": 7, "bind": [7, 15], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 20, 23, 25], "addit": [7, 9, 11, 13, 31], "auto": 7, "automat": 7, "failur": [7, 17], "g": 7, "gui": [7, 12, 17], "keep": 7, "clear": 7, "comma": 7, "separ": 7, "come": [7, 9], "specif": [7, 9, 15, 17, 27, 31], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "role": 7, "privileg": 7, "That": [7, 9, 12], "mean": [7, 12, 18, 19, 20, 21, 22, 26, 28, 31], "chang": [7, 12, 15, 17], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 12], "b": 7, "o": [7, 14, 25], "disk": [7, 9, 12, 17, 18, 20, 25], "relev": [7, 25], "possibl": [7, 9, 15, 24, 31], "api": [7, 8, 15], "resolv": 7, "explicitli": [7, 12], "week": 7, "request": [7, 15, 25], "how": [7, 8, 9, 12, 19, 20, 21, 25, 31], "someth": [7, 9, 10, 12, 30], "opportun": 7, "demonstr": 7, "cover": 7, "30": [7, 9], "30d": 7, "anoth": [7, 9], "arbitrari": 7, "opensourc": 8, "top": 8, "additiuon": 8, "high": [8, 12, 20], "horizont": 8, "scale": 8, "backup": 8, "benefit": [8, 31], "flexibl": 8, "design": 8, "some": [8, 9, 25, 29], "front": 8, "few": 8, "reason": [8, 12, 17, 28, 31], "why": [8, 12], "total": [8, 12], "million": 8, "singl": [8, 12, 25], "capac": 8, "sometim": 8, "traffic": [8, 17, 29, 31], "between": [8, 17, 25, 31], "reachabl": 8, "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 12, 20], "expos": [8, 15], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 25], "10903": 8, "10904": 8, "replica": [8, 19, 20, 21, 25, 26, 31], "connect": [8, 12, 15, 17], "abov": 8, "last": 8, "db_address": 8, "could": [8, 25, 29, 31], "long": [8, 9, 30], "now": [8, 9], "enhanc": [9, 10], "notifi": [9, 10, 25], "wrong": [9, 10, 12, 17, 30, 31], "shown": [9, 17], "overview": [9, 20, 25], "email": 9, "slack": 9, "condit": 9, "met": 9, "certain": 9, "defin": [9, 12, 24, 31], "what": 9, "happen": [9, 17], "report": [9, 14, 17, 31], "let": 9, "u": 9, "instancedown": 9, "expr": [9, 12], "60": 9, "sever": [9, 11, 13, 32], "annot": 9, "descript": [9, 25], "been": 9, "summari": 9, "legal": 9, "express": 9, "equal": 9, "minim": 9, "durat": 9, "prior": 9, "pend": 9, "mode": [9, 12], "special": 9, "notif": 9, "forward": 9, "duplic": [9, 31], "rout": [9, 21, 31], "repres": 9, "tree": 9, "win": [9, 17], "inhibit": 9, "mute": 9, "receiv": [9, 31], "via": [9, 17], "sluck": 9, "detail": [9, 25], "wors": 9, "correctli": [9, 12], "mail": 9, "simpl": 9, "negat": 9, "logic": 9, "forc": 9, "reduc": [9, 12, 19], "simul": 9, "actual": [9, 28], "low": [9, 31], "space": 9, "lower": [9, 31], "fire": 9, "show": [9, 12, 14, 31], "propag": 9, "valu": [9, 12, 23, 30, 31], "similar": [9, 12], "free": 9, "big": [9, 31], "bisect": 9, "problem": [9, 25, 31], "give": [11, 13], "upgrad": 11, "explain": [12, 25], "intern": [12, 21, 31], "issu": [12, 25, 29, 31], "whenev": 12, "gone": 12, "save": 12, "mention": 12, "earlier": 12, "overridden": 12, "perman": 12, "eventu": 12, "made": 12, "larg": [12, 25], "maintain": 12, "json": 12, "too": [12, 30], "verbos": 12, "element": [12, 25], "object": 12, "attribut": 12, "graph": [12, 31], "aliascolor": 12, "bar": 12, "error": [12, 25, 26, 28], "fill": 12, "grid": 12, "threshold1": 12, "null": 12, "threshold1color": 12, "rgba": 12, "216": 12, "200": 12, "threshold2": 12, "threshold2color": 12, "234": 12, "112": 12, "gridpo": 12, "w": [12, 17], "x": [12, 17], "y": 12, "id": [12, 17], "isnew": 12, "legend": 12, "avg": 12, "max": 12, "min": 12, "linewidth": 12, "link": [12, 25], "nullpointmod": 12, "percentag": [12, 31], "pointradiu": 12, "render": 12, "flot": 12, "seriesoverrid": 12, "span": 12, "steppedlin": 12, "sum": 12, "node_filesystem_avail": 12, "intervalfactor": 12, "legendformat": 12, "refid": 12, "timefrom": 12, "timeshift": 12, "titl": 12, "size": [12, 22, 31], "tooltip": 12, "msresolut": 12, "share": 12, "sort": [12, 24, 31], "value_typ": 12, "cumul": 12, "transpar": 12, "xaxi": 12, "yax": 12, "percent": 12, "logbas": 12, "101": 12, "short": 12, "imagin": 12, "redund": 12, "resembl": 12, "css": 12, "hierarch": 12, "definit": [12, 31], "inherit": 12, "row": [12, 24, 31], "base_row": 12, "collaps": 12, "height": 12, "250px": 12, "150px": 12, "output": 12, "bytes_panel": 12, "byte": 12, "unit": 12, "axi": 12, "adjust": 12, "readabl": 12, "gb": 12, "mb": 12, "grasp": 12, "origin": [12, 27], "12": [12, 17], "wa": [12, 31], "larger": 12, "break": [12, 22, 31], "longer": 12, "later": 12, "absolut": 12, "posit": 12, "ie": 12, "width": 12, "backward": [12, 17], "ve": 12, "had": 12, "imposs": 12, "hand": 12, "overcom": 12, "transit": 12, "calcul": 12, "taken": 12, "still": 12, "unlik": 12, "partial": 12, "24": 12, "don": 12, "python": 12, "make_dashboard": 12, "revers": [12, 25], "usual": [12, 17, 25, 31], "easier": 12, "wrapper": 12, "re": [12, 21], "just": 12, "refresh": 12, "generate_gener": 12, "mayb": 12, "interfac": [13, 17], "2021": 14, "2018": [14, 22], "14": [14, 17], "onlin": 15, "prometheus_port": 15, "restrict": 15, "prometheus_address": 15, "integr": 16, "56090": 17, "old": 17, "howev": 17, "twice": 17, "easiest": 17, "remov": 17, "scylla_manager1": 17, "messag": 17, "wait": [17, 26], "non": [17, 20, 21, 25, 29, 31], "post": 17, "proper": 17, "past": 17, "mai": [17, 25, 26, 31], "ownership": 17, "la": 17, "grep": 17, "drwxr": 17, "xr": 17, "4096": 17, "jun": 17, "51": 17, "chown": 17, "appear": 17, "unreach": [17, 26], "immedi": 17, "suspect": 17, "tab": 17, "rang": [17, 31], "align": 17, "On": [17, 25], "41bd3db26240": 17, "entrypoin": 17, "ago": 17, "23": 17, "7001": 17, "tcp": 17, "9042": 17, "9160": 17, "10000": 17, "click": 17, "usag": [17, 21, 31], "fetch": 17, "curl": 17, "scylla_nod": 17, "return": [17, 18, 19, 20, 22, 26, 28, 31], "ef": 17, "gre": 17, "scylla_setup": 17, "9100": 17, "while": 17, "captur": 17, "tshark": 17, "f": 17, "dst": 17, "eth0": 17, "toward": 17, "199": 17, "203": 17, "229": 17, "89": 17, "142": 17, "59212": 17, "ack": 17, "seq": 17, "317": 17, "78193": 17, "158080": 17, "len": 17, "tsval": 17, "79869679": 17, "tsecr": 17, "3347447210": 17, "74": 17, "60440": 17, "syn": 17, "29200": 17, "mss": 17, "1460": 17, "sack_perm": 17, "79988291": 17, "128": 17, "side": [18, 25, 31], "primari": [18, 31], "kei": [18, 24, 31], "scan": 18, "These": [18, 31], "kind": [18, 31], "bigger": 18, "care": [18, 19, 20, 31], "replicationfactor": [19, 20], "piec": 19, "determin": [19, 20, 26, 31], "mani": [19, 20, 31], "repli": [19, 20, 22, 26, 28, 31], "fail": [19, 21, 25, 31], "unavail": [19, 31], "client": [19, 22, 25, 31], "respond": 19, "accompani": 19, "deep": 19, "understand": 19, "fall": 19, "back": 19, "mechan": 19, "write": 20, "acknowledg": 20, "coordin": [20, 21, 26, 28, 31], "hint": 20, "fact": 20, "yet": 20, "cours": [20, 21], "essenti": 20, "text": [20, 31], "20of": 20, "20the": 20, "20most": 20, "20common": 20, "20with": 20, "20lowest": 20, "20consist": 20, "distribut": [21, 29, 31], "ideal": [21, 31], "latenc": [21, 25, 31], "resourc": [21, 24, 31], "driver": [21, 22, 29, 31], "replic": [21, 26, 28, 31], "prepar": [21, 25, 29], "statement": [21, 23, 25, 29], "balanc": [21, 25, 31], "polici": 21, "caus": [21, 31], "intro": 21, "recap": 21, "ring": [21, 31], "architectur": 21, "chunk": [22, 31], "increas": [22, 31], "overal": [22, 31], "thu": 22, "www": [22, 29], "07": 22, "13": 22, "effici": [22, 31], "optim": [23, 29, 32], "concret": 23, "thumb": 23, "alwai": 23, "favor": 23, "partit": [24, 25], "BY": [24, 31], "ineffici": [24, 31], "consum": 24, "doc": 24, "recogn": 25, "bad": 25, "practic": [25, 29], "potenti": [25, 31], "solv": 25, "left": 25, "categori": [25, 31], "jump": 25, "warn": 25, "cell": 25, "indic": [25, 30, 31], "model": [25, 29, 31], "impact": 25, "imbal": 25, "shard": 25, "imbalanc": 25, "hot": 25, "bottleneck": [25, 29], "cach": 25, "hit": 25, "filter": 25, "token": 25, "awar": 25, "select": [25, 31], "page": 25, "order": [25, 31], "oper": [25, 31], "due": 25, "unsatisfi": 25, "faulti": 25, "evict": 25, "answer": [26, 28], "aka": 26, "factor": 26, "quorum": [26, 31], "hardwar": 27, "occur": 27, "leav": 28, "risk": 28, "identifi": [28, 31], "evenli": 29, "across": 29, "becom": 29, "explan": 29, "08": 29, "20": 29, "best": 29, "field": 30, "being": 30, "defi": 30, "purpos": 30, "might": 30, "upper": 31, "gaug": 31, "inspect": 31, "zero": 31, "mislead": 31, "panel": 31, "first": 31, "holder": 31, "safer": 31, "prevent": 31, "inject": 31, "rate": 31, "did": 31, "compound": 31, "column": 31, "ks1": 31, "table_demo": 31, "int": 31, "WITH": 31, "desc": 31, "cat1": 31, "asc": 31, "overhead": 31, "thing": 31, "much": 31, "drop": 31, "were": 31, "major": 31, "success": 31, "hurt": 31, "cl": 31, "expens": 31, "term": 31, "cost": 31, "ONE": 31, "local_quorum": 31, "local_on": 31, "reli": 31, "nearest": 31, "advisor": 32}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 20, 25, 32], "monitor": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 25, 32], "stack": [1, 3, 5, 6, 8, 10, 11, 13, 14, 15, 16, 17, 25, 32], "us": [2, 6, 8, 12, 18, 19, 20, 24, 32], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 12], "set": 2, "prometheu": [2, 4, 5, 6, 7, 8, 9, 15], "grafana": [2, 5, 6, 7, 12, 17], "provis": 2, "data": [2, 6, 8, 17], "sourc": [2, 8, 17], "file": [2, 6, 17], "dashboard": [2, 6, 12], "load": 2, "start": [2, 6, 7, 17], "stop": [2, 6], "download": 3, "instal": [3, 5, 6], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 12], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 27], "space": [4, 5, 6], "requir": [4, 5, 6], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 9], "loki": 5, "compat": 6, "matrix": [6, 14], "post": [6, 22, 29], "configur": [6, 8], "node": [6, 27], "from": [6, 12], "manag": [6, 7, 10, 17], "consul": 6, "api": 6, "connect": 6, "an": [6, 9], "extern": 6, "directori": [6, 17], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": 6, "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 12, 25, 31], "all": [7, 19], "sh": [7, 12], "command": 7, "gener": [7, 12], "option": 7, "relat": 7, "ldap": 7, "support": [7, 14], "retent": 7, "period": 7, "alert": [7, 9, 10], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 18, 19, 20, 21, 22, 23, 24, 29, 31], "updat": 8, "tip": 9, "when": 9, "ad": [9, 12], "procedur": 11, "modifi": 12, "limit": 12, "consist": [12, 19, 20, 26, 31], "between": 12, "restart": 12, "upgrad": [12, 17], "templat": 12, "class": 12, "panel": 12, "exampl": 12, "format": 12, "layout": 12, "valid": 12, "refer": 13, "guid": [13, 16], "interfac": 15, "troubleshoot": [16, 17], "problem": 17, "2": 17, "duplic": 17, "inform": 17, "A": 17, "contain": 17, "fail": [17, 26, 28], "To": 17, "And": 17, "permiss": 17, "No": 17, "point": 17, "solut": 17, "chart": 17, "show": 17, "error": [17, 27], "sign": 17, "server": 17, "level": [17, 19, 20, 26, 31], "metric": 17, "notic": 17, "user": 17, "open": 17, "3": 17, "0": 17, "enterpris": 17, "2019": 17, "1": 17, "work": 17, "wireshark": 17, "some": [18, 19, 20, 21, 22, 23, 24, 26, 28], "allow": [18, 31], "filter": [18, 31], "ani": 20, "link": [20, 21, 22, 24, 29], "univers": [20, 21], "ar": [21, 22, 23, 29], "token": [21, 31], "awar": [21, 31], "select": 22, "non": [22, 23], "page": [22, 31], "blog": [22, 29], "prepar": [23, 30, 31], "revers": [24, 31], "order": 24, "document": 24, "advisor": 25, "section": 25, "oper": [26, 28], "due": 26, "unsatisfi": 26, "i": 27, "o": 27, "can": 27, "indic": 27, "faulti": 27, "replica": 28, "side": 28, "cql": [29, 31], "balanc": 29, "among": 29, "shard": 29, "statement": [30, 31], "cach": 30, "evict": 30, "optim": 31, "read": 31, "cross": 31, "dc": 31, "request": 31}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Troubleshooting Guide for Scylla Monitoring Stack": [[16, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Some queries use Consistency Level: ANY": [[20, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[20, "link-to-scylla-university"]], "Some queries use Consistency Level: ALL": [[19, "some-queries-use-consistency-level-all"]], "Some queries are not token-aware": [[21, "some-queries-are-not-token-aware"]], "University link": [[21, "university-link"]], "Some queries use ALLOW FILTERING": [[18, "some-queries-use-allow-filtering"]], "Some queries are non-prepared": [[23, "some-queries-are-non-prepared"]], "Some SELECT queries are non-paged": [[22, "some-select-queries-are-non-paged"]], "Blog-post Links": [[22, "blog-post-links"]], "Troubleshoot Scylla Monitoring Stack": [[17, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[17, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[17, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[17, "a-container-fails-to-start"]], "Files And Directory Permissions": [[17, "files-and-directory-permissions"]], "No Data Points": [[17, "no-data-points"]], "Solution": [[17, "solution"], [17, "id1"], [17, "id2"], [17, "id3"]], "Grafana Chart Shows Error (!) Sign": [[17, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[17, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[17, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[17, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[17, "working-with-wireshark"]], "I/O Errors can indicate a node with a faulty disk": [[27, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some operation failed due to unsatisfied consistency level": [[26, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Scylla Monitoring Stack Advisor": [[25, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[25, "the-advisor-section"]], "Some queries use reverse order": [[24, "some-queries-use-reverse-order"]], "Documentation link": [[24, "documentation-link"]], "The CQL Optimization": [[31, "the-cql-optimization"]], "Prepared Statements": [[31, "prepared-statements"]], "Token Aware": [[31, "token-aware"]], "Paged Queries": [[31, "paged-queries"]], "Reversed CQL Reads": [[31, "reversed-cql-reads"]], "ALLOW FILTERING": [[31, "allow-filtering"]], "Consistency Level": [[31, "consistency-level"]], "Cross DC": [[31, "cross-dc"]], "Cross DC Consistency Level": [[31, "cross-dc-consistency-level"]], "Cross DC read requests": [[31, "cross-dc-read-requests"]], "CQL queries are not balanced among shards": [[29, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[29, "blog-post-link"]], "Some operations failed on the replica side": [[28, "some-operations-failed-on-the-replica-side"]], "Prepared statements cache eviction": [[30, "prepared-statements-cache-eviction"]], "Adding and Modifying Dashboards": [[12, "adding-and-modifying-dashboards"]], "General Limitations": [[12, "general-limitations"]], "consistency between restarts": [[12, "consistency-between-restarts"]], "consistency between upgrades": [[12, "consistency-between-upgrades"]], "Using templated Dashboards": [[12, "using-templated-dashboards"]], "The template class system": [[12, "the-template-class-system"]], "Panel example": [[12, "panel-example"]], "Grafana Formats and Layouts": [[12, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[12, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[12, "prerequisite"], [2, "prerequisite"]], "Validation": [[12, "validation"]], "Alerting": [[9, "alerting"]], "Prometheus Alerts": [[9, "prometheus-alerts"]], "Alertmanager": [[9, "alertmanager"]], "Tips When Adding an Alert": [[9, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Interfaces": [[15, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[15, "prometheus"]], "Scylla Monitoring Stack Alert Manager": [[10, "scylla-monitoring-stack-alert-manager"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Scylla Monitoring Stack Procedures": [[11, "scylla-monitoring-stack-procedures"]], "Scylla Monitoring Stack Reference Guide": [[13, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Support Matrix": [[14, "scylla-monitoring-stack-support-matrix"]], "Using Scylla Monitoring Stack": [[32, "using-scylla-monitoring-stack"]], "The start-all.sh command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Scylla Monitoring Stack": [[1, "scylla-monitoring-stack"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.8/sitemap.xml b/branch-3.8/sitemap.xml new file mode 100644 index 000000000..85f2de1bb --- /dev/null +++ b/branch-3.8/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.8/troubleshooting/index.html b/branch-3.8/troubleshooting/index.html new file mode 100644 index 000000000..0507da209 --- /dev/null +++ b/branch-3.8/troubleshooting/index.html @@ -0,0 +1,645 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Troubleshooting Guide for Scylla Monitoring Stack

                +
                +
                +

                Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/troubleshooting/monitor_troubleshoot.html b/branch-3.8/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..f55bb525e --- /dev/null +++ b/branch-3.8/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,853 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Troubleshoot Scylla Monitoring Stack

                +

                This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                +
                +

                Problem

                + +
                +

                Scylla-Manager 2.2 with Duplicate information

                +

                Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                +
                  +
                • For Manager server: from 56090 to 5090

                • +
                • For Manager Agent: from 56090 to 5090

                • +
                +

                For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                +

                However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                +

                The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                +

                Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                +
                +
                +

                A Container Fails To Start

                +

                When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                +
                Wait for Prometheus container to start........Error: Prometheus container failed to start
                +
                +
                +

                Should this happen, check the Docker logs for more information.

                +
                docker logs aprom
                +
                +
                +

                Usually the reason for the failure is described in the logs.

                +
                +
                +

                Files And Directory Permissions

                +
                +

                Note

                +

                Avoid running Docker containers as root.

                +
                +

                The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                +

                If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                +
                +

                Note

                +

                If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                +
                +

                For example if your Prometheus data directory is /prom-data and you are using centos user

                +
                ls -la /|grep prom-data
                +
                +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                +
                +sudo chown -R centos:centos /prom-data
                +
                +ls -la /|grep prom-data
                +
                +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                +
                +
                +
                +
                +

                No Data Points

                +

                No data points on all data charts.

                +
                +

                Solution

                +

                If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                +
                  +
                1. Login to the Prometheus console:

                2. +
                3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                4. +
                5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                6. +
                +
                +
                  +
                • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                • +
                • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                • +
                • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                • +
                +
                +

                For example:

                +
                ./start-all.sh -v 3.1
                +
                +
                +

                More on start-all.sh options.

                +
                +
                +
                +

                Grafana Chart Shows Error (!) Sign

                +

                Run this procedure on the Scylla Monitoring Stack server.

                +

                If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                +
                +

                Solution

                +

                On the Scylla Monitoring Stack server:

                +
                  +
                1. Check Prometheus is running using docker ps.

                2. +
                +
                  +
                • If it is not running check the prometheus.yml for errors.

                • +
                +

                For example:

                +
                CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                +
                +
                +
                  +
                • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                • +
                +
                +
                +
                +

                Grafana Shows Server Level Metrics, but not Scylla Metrics

                +

                Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                +
                +

                Solution

                +
                  +
                • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                • +
                +

                For example

                +
                curl 172.17.0.2:9180/metrics
                +
                +
                +
                +
                +
                +

                Grafana Shows Scylla Metrics, but not Server Level Metrics

                +

                Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                +
                +

                Solution

                +

                1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                +
                  +
                1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                2. +
                +
                +
                +

                Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                +

                While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                +

                If the node_exporter service is not starting it may need to be updated manually.

                +

                Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                +
                +
                +
                +

                Working with Wireshark

                +

                No metrics shown in the Scylla Monitoring Stack.

                +
                  +
                1. Install wireshark

                2. +
                +

                2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                +

                For example:

                +
                tshark -i eth0 -f "dst port 9180"
                +
                +
                +

                Capture from Scylla node towards Scylla Monitoring Stack server.

                +

                In this example, Scylla is running.

                +
                Monitor ip        Scylla node ip
                +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                +
                +
                +

                In this example, Scylla is not running

                +
                Monitor ip        Scylla node ip
                +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                +
                +
                +
                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlAllowFiltering.html b/branch-3.8/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..faea980cf --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries use ALLOW FILTERING

                +

                Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                +

                These kinds of queries can create a bigger load on Scylla, and should be used with care.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlCLAll.html b/branch-3.8/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..2ee318335 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries use Consistency Level: ALL

                +

                Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                +

                Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                +

                Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlCLAny.html b/branch-3.8/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..98966964a --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries use Consistency Level: ANY

                +

                Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                +

                Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlNoTokenAware.html b/branch-3.8/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..8d6307c1d --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries are not token-aware

                +

                Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                +

                Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlNonPaged.html b/branch-3.8/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..4f0e71a85 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some SELECT queries are non-paged

                +

                By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                +
                +

                Blog-post Links

                +

                https://www.scylladb.com/2018/07/13/efficient-query-paging/

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlNonPrepared.html b/branch-3.8/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..56d0246df --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries are non-prepared

                +

                Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/cqlReverseOrder.html b/branch-3.8/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..a4f004b16 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Some queries use reverse order

                +

                Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                +

                Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/index.html b/branch-3.8/use-monitoring/advisor/index.html new file mode 100644 index 000000000..6bd036533 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/index.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Scylla Monitoring Stack Advisor

                +
                +
                +

                The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them.

                +
                +

                The Advisor section

                +
                +../../_images/advisor_panel.png +
                +

                The Advisor section

                +
                +
                +

                The Advisor section is located on the Overview dashboard and consists of two parts:

                +

                On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                +

                For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                +

                On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                +

                For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                +

                Each Advisor issue is explained in detail:

                + +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/nodeCLErrors.html b/branch-3.8/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..5d3f34d04 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Some operation failed due to unsatisfied consistency level

                +

                ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                +

                For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                +

                When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/nodeIOErrors.html b/branch-3.8/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..b1a282271 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,652 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                I/O Errors can indicate a node with a faulty disk

                +

                I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/nodeLocalErrors.html b/branch-3.8/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..eaeec2b5e --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,653 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Some operations failed on the replica side

                +

                ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                +

                An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-3.8/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..49b18699d --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                CQL queries are not balanced among shards

                +

                For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                +

                There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                +
                +

                Blog post link

                +

                https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/advisor/preparedCacheEviction.html b/branch-3.8/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..3becda0d8 --- /dev/null +++ b/branch-3.8/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                Prepared statements cache eviction

                +

                Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                +
                  +
                • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                • +
                • The prepared statements cache might be too small for the number of prepared statements.

                • +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/cql_optimization.html b/branch-3.8/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..6b194bbcf --- /dev/null +++ b/branch-3.8/use-monitoring/cql_optimization.html @@ -0,0 +1,774 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + + + +
                +

                The CQL Optimization

                +

                The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

                +
                +../_images/cql_optimization_master.png +
                +

                The CQL Dashboard

                +
                +
                +

                The upper part of the dashboard holds CQL related metrics.

                +

                The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                +
                +

                Note

                +

                Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                +
                +

                The following sections describe each of the dashboard’s panel

                +
                +

                Prepared Statements

                +

                Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                +

                Using prepared statements has the following benefits:

                +
                  +
                • The database only needs to parse the query once

                • +
                • The driver can route the query to the right node

                • +
                • Using place-holders and values is safer and prevents CQL-Injection

                • +
                +

                The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                +

                The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                +
                +
                +

                Token Aware

                +

                Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                +

                Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                +

                The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                +

                The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                +
                +
                +

                Paged Queries

                +

                By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                +

                The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                +

                The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                +
                +
                +

                Reversed CQL Reads

                +

                Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                +

                Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                +

                For example, look at the following table:

                +
                CREATE TABLE ks1.table_demo (
                +   category text,
                +   type int,
                +   PRIMARY KEY (category, type))
                +WITH CLUSTERING ORDER BY (type DESC);
                +
                +
                +

                The following query uses reverse order:

                +
                select * from ks1.table_demo where category='cat1' order by type ASC;
                +
                +
                +

                The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                +

                The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                +
                +
                +

                ALLOW FILTERING

                +

                Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                +

                These kinds of queries can create a big load on the system, and should be used with care.

                +

                The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                +

                The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                +

                The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                +

                The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                +

                The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                +
                +
                +

                Consistency Level

                +

                Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                +

                The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                +

                Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                +

                The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                +

                The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                +

                The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                +

                The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                +
                +
                +

                Cross DC

                +

                Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                +
                +
                +

                Cross DC Consistency Level

                +

                Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                +
                +
                +

                Cross DC read requests

                +
                +

                Note

                +

                The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                +
                +

                In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                +

                The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                +
                +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.8/use-monitoring/index.html b/branch-3.8/use-monitoring/index.html new file mode 100644 index 000000000..23d264539 --- /dev/null +++ b/branch-3.8/use-monitoring/index.html @@ -0,0 +1,645 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +
                +

                Using Scylla Monitoring Stack

                +
                +
                +

                There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                + +
                + + +
                + + + + + + + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.9/.buildinfo b/branch-3.9/.buildinfo new file mode 100644 index 000000000..494175442 --- /dev/null +++ b/branch-3.9/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 6ade67ed7665336807830ef5789e398a +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-3.9/.doctrees/_common/monitor-description.doctree b/branch-3.9/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..541efe87f Binary files /dev/null and b/branch-3.9/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-3.9/.doctrees/environment.pickle b/branch-3.9/.doctrees/environment.pickle new file mode 100644 index 000000000..fd18cf842 Binary files /dev/null and b/branch-3.9/.doctrees/environment.pickle differ diff --git a/branch-3.9/.doctrees/index.doctree b/branch-3.9/.doctrees/index.doctree new file mode 100644 index 000000000..2374de959 Binary files /dev/null and b/branch-3.9/.doctrees/index.doctree differ diff --git a/branch-3.9/.doctrees/install/docker_compose.doctree b/branch-3.9/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..d9f4f75e1 Binary files /dev/null and b/branch-3.9/.doctrees/install/docker_compose.doctree differ diff --git a/branch-3.9/.doctrees/install/index.doctree b/branch-3.9/.doctrees/install/index.doctree new file mode 100644 index 000000000..5c8203609 Binary files /dev/null and b/branch-3.9/.doctrees/install/index.doctree differ diff --git a/branch-3.9/.doctrees/install/min-prod-hw.doctree b/branch-3.9/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..f15f17bb8 Binary files /dev/null and b/branch-3.9/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-3.9/.doctrees/install/monitor_without_docker.doctree b/branch-3.9/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..8a9d023a8 Binary files /dev/null and b/branch-3.9/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-3.9/.doctrees/install/monitoring_stack.doctree b/branch-3.9/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..ca2a8a3a4 Binary files /dev/null and b/branch-3.9/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-3.9/.doctrees/install/start_all.doctree b/branch-3.9/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..1e621e0e8 Binary files /dev/null and b/branch-3.9/.doctrees/install/start_all.doctree differ diff --git a/branch-3.9/.doctrees/install/thanos.doctree b/branch-3.9/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..284a18f2f Binary files /dev/null and b/branch-3.9/.doctrees/install/thanos.doctree differ diff --git a/branch-3.9/.doctrees/intro.doctree b/branch-3.9/.doctrees/intro.doctree new file mode 100644 index 000000000..f3e2e1b7b Binary files /dev/null and b/branch-3.9/.doctrees/intro.doctree differ diff --git a/branch-3.9/.doctrees/procedures/alerts/alerting.doctree b/branch-3.9/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..9340fafe6 Binary files /dev/null and b/branch-3.9/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-3.9/.doctrees/procedures/alerts/index.doctree b/branch-3.9/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..b9bbeab9e Binary files /dev/null and b/branch-3.9/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-3.9/.doctrees/procedures/index.doctree b/branch-3.9/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..28553b353 Binary files /dev/null and b/branch-3.9/.doctrees/procedures/index.doctree differ diff --git a/branch-3.9/.doctrees/procedures/updating_dashboard.doctree b/branch-3.9/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..97a75f0af Binary files /dev/null and b/branch-3.9/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-3.9/.doctrees/reference/index.doctree b/branch-3.9/.doctrees/reference/index.doctree new file mode 100644 index 000000000..44043b3b6 Binary files /dev/null and b/branch-3.9/.doctrees/reference/index.doctree differ diff --git a/branch-3.9/.doctrees/reference/matrix.doctree b/branch-3.9/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..9748d42db Binary files /dev/null and b/branch-3.9/.doctrees/reference/matrix.doctree differ diff --git a/branch-3.9/.doctrees/reference/monitoring_apis.doctree b/branch-3.9/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..a80632314 Binary files /dev/null and b/branch-3.9/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-3.9/.doctrees/troubleshooting/index.doctree b/branch-3.9/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..ab18bbb93 Binary files /dev/null and b/branch-3.9/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-3.9/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-3.9/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..8434e1ed0 Binary files /dev/null and b/branch-3.9/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/index.doctree b/branch-3.9/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..bd6558a2e Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/index.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..293f7ee83 Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..0c5a82c32 Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..41bcd752c Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..0b5cbef93 Binary files /dev/null and b/branch-3.9/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..b5d1a254a Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..82bdd6efd Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..d69b708e0 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..99d0a6e6c Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..6b02bd992 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..b1a70220a Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..9a03ef060 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/index.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..ea2e46fea Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..872d1cd07 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..cf2fdcf59 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..30f809771 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..46e75b98f Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-3.9/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..68b2d6096 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/cql_optimization.doctree b/branch-3.9/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..41f574049 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-3.9/.doctrees/use-monitoring/index.doctree b/branch-3.9/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..fe6a03855 Binary files /dev/null and b/branch-3.9/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-3.9/.nojekyll b/branch-3.9/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-3.9/404.html b/branch-3.9/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-3.9/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                +

                404

                +

                The ScyllaDB monster ate your page!

                +

                + Home +

                +
                + + + \ No newline at end of file diff --git a/branch-3.9/CNAME b/branch-3.9/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-3.9/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-3.9/_common/monitor-description.html b/branch-3.9/_common/monitor-description.html new file mode 100644 index 000000000..46ed8cfce --- /dev/null +++ b/branch-3.9/_common/monitor-description.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + +
                +
                + Menu +
                +
                +
                +
                +
                + + +
                +

                Caution

                +

                + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                +
                + + + +
                + +
                + +

                Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                + + +
                + + + + + +
                + + +
                + +
                + +
                + + + + +
                + + + + + + + \ No newline at end of file diff --git a/branch-3.9/_images/1.png b/branch-3.9/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-3.9/_images/1.png differ diff --git a/branch-3.9/_images/2.png b/branch-3.9/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-3.9/_images/2.png differ diff --git a/branch-3.9/_images/3.png b/branch-3.9/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-3.9/_images/3.png differ diff --git a/branch-3.9/_images/advisor_panel.png b/branch-3.9/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-3.9/_images/advisor_panel.png differ diff --git a/branch-3.9/_images/alertmanager.png b/branch-3.9/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-3.9/_images/alertmanager.png differ diff --git a/branch-3.9/_images/cql_optimization_master.png b/branch-3.9/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-3.9/_images/cql_optimization_master.png differ diff --git a/branch-3.9/_images/grafana.png b/branch-3.9/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-3.9/_images/grafana.png differ diff --git a/branch-3.9/_images/monitor.png b/branch-3.9/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-3.9/_images/monitor.png differ diff --git a/branch-3.9/_images/monitoring_stack.png b/branch-3.9/_images/monitoring_stack.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-3.9/_images/monitoring_stack.png differ diff --git a/branch-3.9/_images/monitoring_stack1.png b/branch-3.9/_images/monitoring_stack1.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-3.9/_images/monitoring_stack1.png differ diff --git a/branch-3.9/_sources/_common/monitor-description.rst.txt b/branch-3.9/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-3.9/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-3.9/_sources/index.rst.txt b/branch-3.9/_sources/index.rst.txt new file mode 100644 index 000000000..9233bc21d --- /dev/null +++ b/branch-3.9/_sources/index.rst.txt @@ -0,0 +1,42 @@ +======================== +Scylla Monitoring Stack +======================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `Scylla Monitoring Stack lesson `_ on Scylla University +* `Scylla Monitoring Stack GitHub Project `_ + +For older versions of Scylla Monitoring Stack Documentation see `here `_. \ No newline at end of file diff --git a/branch-3.9/_sources/install/docker_compose.rst.txt b/branch-3.9/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-3.9/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-3.9/_sources/install/index.rst.txt b/branch-3.9/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-3.9/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-3.9/_sources/install/min-prod-hw.rst.txt b/branch-3.9/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..443638374 --- /dev/null +++ b/branch-3.9/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,32 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. diff --git a/branch-3.9/_sources/install/monitor_without_docker.rst.txt b/branch-3.9/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..662dbb776 --- /dev/null +++ b/branch-3.9/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,437 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +``wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.9.0.tar.gz`` + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``scylla-monitoring-scylla-monitoring-3.9.0/prometheus`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.9.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``scylla-monitoring-scylla-monitoring-3.9.0/prometheus`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + + cp scylla-monitoring-scylla-monitoring-3.9.0/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-3.9.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + + cd scylla-monitoring-scylla-monitoring-3.9.0/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +``cd scylla-monitoring-scylla-monitoring-3.9.0/`` + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + diff --git a/branch-3.9/_sources/install/monitoring_stack.rst.txt b/branch-3.9/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..305bb1182 --- /dev/null +++ b/branch-3.9/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,382 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +.. contents:: + :depth: 2 + :local: + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API`_. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +.. _`Scylla Prometheus API`: monitoring_apis#prometheus + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can `Deploy Scylla Monitoring Stack Without Docker `_ . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout branch-3.9 + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-3.9/_sources/install/start_all.rst.txt b/branch-3.9/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..574e6861c --- /dev/null +++ b/branch-3.9/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh command +======================== + +Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and by doing that makes it persistent. +This is only important if you are creating your own dashboards using the grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana, multiple parameters are supported. + +**-c grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and by doing so alters its configuration. + +**-g grafana port** Override the default grafana port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior  by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allows adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for 2 weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrates how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-3.9/_sources/install/thanos.rst.txt b/branch-3.9/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..ffaf430af --- /dev/null +++ b/branch-3.9/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912 + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903 + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + \ No newline at end of file diff --git a/branch-3.9/_sources/intro.rst.txt b/branch-3.9/_sources/intro.rst.txt new file mode 100644 index 000000000..8bad4d48a --- /dev/null +++ b/branch-3.9/_sources/intro.rst.txt @@ -0,0 +1,49 @@ +======================= +Scylla Monitoring Stack +======================= + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the `node_exporter` agent that runs on the Scylla server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-3.9/_sources/procedures/alerts/alerting.rst.txt b/branch-3.9/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-3.9/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-3.9/_sources/procedures/alerts/index.rst.txt b/branch-3.9/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-3.9/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-3.9/_sources/procedures/index.rst.txt b/branch-3.9/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-3.9/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-3.9/_sources/procedures/updating_dashboard.rst.txt b/branch-3.9/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..5113102a8 --- /dev/null +++ b/branch-3.9/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,302 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It will explain about Scylla Monitoring Stack dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades. + +consistency between restarts +**************************** + +By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana. + +consistency between upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitor does. + + +Using templated Dashboards +########################## +Why does Scylla Monitor use dashboard templates? + +We found the Grafana dashboards Json format too verbose to be maintainable. + +Each element in the dashboard file (Each Json object) contains all of its attributes and values. + +For example a typical graph panel would look like: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of Grafana JSON format, we added dashboard templates. + +The template class system +*************************** + +Scylla Monitoring Stack dashboard templates use ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example row in the `type.json` defined + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +In a Template it will be used like + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +The output will be + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and override the ``height`` attribute. + + +Panel example +************* + +Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, we used the `bytes_panel` class that generate a graph with bytes as units (that would mean that your +`Y` axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc') + +You can also see that we override the `span` attribute to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +you can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` you should see that it run without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-3.9/_sources/reference/index.rst.txt b/branch-3.9/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-3.9/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-3.9/_sources/reference/matrix.rst.txt b/branch-3.9/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..0bc86c809 --- /dev/null +++ b/branch-3.9/_sources/reference/matrix.rst.txt @@ -0,0 +1,110 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-3.9/_sources/reference/monitoring_apis.rst.txt b/branch-3.9/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..6d64821bc --- /dev/null +++ b/branch-3.9/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see `Scylla Monitoring Stack `_ + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-3.9/_sources/troubleshooting/index.rst.txt b/branch-3.9/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-3.9/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-3.9/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-3.9/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..2cc1457ea --- /dev/null +++ b/branch-3.9/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,225 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +.. contents:: + :depth: 1 + :local: + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-3.9/_sources/upgrade/index.rst.txt b/branch-3.9/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..f4d76733b --- /dev/null +++ b/branch-3.9/_sources/upgrade/index.rst.txt @@ -0,0 +1,39 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                +
                +
                +
                Upgrade Scylla Open Source
                +
                +
                + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                +
                +
                diff --git a/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..64ea1f3c1 --- /dev/null +++ b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,104 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + +.. contents:: + :local: + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** montioring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade
                ` +* `Prometheus Migration `_ diff --git a/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..21d3a7160 --- /dev/null +++ b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,135 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + +.. contents:: + :local: + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..87b2d767c --- /dev/null +++ b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,66 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +.. contents:: + :local: + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..03f6f268d --- /dev/null +++ b/branch-3.9/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,142 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +.. contents:: + :local: + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..98a3b14d3 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/scylla-essentials-overview/lessons/high-availability/topic/consistency-level/#:~:text=Some%20of%20the%20most%20common,availability%20with%20the%20lowest%20consistency. diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-3.9/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-3.9/_sources/use-monitoring/advisor/index.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..6d4d3e6fe --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-3.9/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-3.9/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-3.9/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-3.9/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-3.9/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-3.9/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-3.9/_sources/use-monitoring/cql_optimization.rst.txt b/branch-3.9/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..eafc82e4b --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-3.9/_sources/use-monitoring/index.rst.txt b/branch-3.9/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-3.9/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-3.9/_static/basic.css b/branch-3.9/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-3.9/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-3.9/_static/check-solid.svg b/branch-3.9/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-3.9/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.9/_static/clipboard.min.js b/branch-3.9/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-3.9/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-3.9/_static/copybutton.css b/branch-3.9/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-3.9/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                Short

                + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-3.9/_static/copybutton.js b/branch-3.9/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-3.9/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-3.9/_static/copybutton_funcs.js b/branch-3.9/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-3.9/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-3.9/_static/css/main.css b/branch-3.9/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-3.9/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-3.9/_static/doctools.js b/branch-3.9/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-3.9/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-3.9/_static/documentation_options.js b/branch-3.9/_static/documentation_options.js new file mode 100644 index 000000000..237299273 --- /dev/null +++ b/branch-3.9/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.3.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-3.9/_static/file.png b/branch-3.9/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-3.9/_static/file.png differ diff --git a/branch-3.9/_static/img/banner-background.svg b/branch-3.9/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-3.9/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.9/_static/img/favicon-228x228.png b/branch-3.9/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-3.9/_static/img/favicon-228x228.png differ diff --git a/branch-3.9/_static/img/favicon-32x32.png b/branch-3.9/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-3.9/_static/img/favicon-32x32.png differ diff --git a/branch-3.9/_static/img/favicon.ico b/branch-3.9/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-3.9/_static/img/favicon.ico differ diff --git a/branch-3.9/_static/img/icons/icon-about-team.svg b/branch-3.9/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-3.9/_static/img/icons/icon-about-us-m.svg b/branch-3.9/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-about-us.svg b/branch-3.9/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-alternator.svg b/branch-3.9/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-apps.svg b/branch-3.9/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-architecture.svg b/branch-3.9/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-3.9/_static/img/icons/icon-benchmarks.svg b/branch-3.9/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-3.9/_static/img/icons/icon-blog.svg b/branch-3.9/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-3.9/_static/img/icons/icon-careers.svg b/branch-3.9/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-3.9/_static/img/icons/icon-chevron-left.svg b/branch-3.9/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.9/_static/img/icons/icon-chevron-right.svg b/branch-3.9/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.9/_static/img/icons/icon-circe.svg b/branch-3.9/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-clock.svg b/branch-3.9/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-close.svg b/branch-3.9/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-cloud-docs.svg b/branch-3.9/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-cloud.svg b/branch-3.9/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-comparison.svg b/branch-3.9/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-3.9/_static/img/icons/icon-contact-us.svg b/branch-3.9/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-3.9/_static/img/icons/icon-developers-blog.svg b/branch-3.9/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-3.9/_static/img/icons/icon-docs.svg b/branch-3.9/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-3.9/_static/img/icons/icon-enterprise-m.svg b/branch-3.9/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-enterprise.svg b/branch-3.9/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-events.svg b/branch-3.9/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-3.9/_static/img/icons/icon-exclamation.svg b/branch-3.9/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-expand.svg b/branch-3.9/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-forum.svg b/branch-3.9/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-getting-started.svg b/branch-3.9/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-glossary.svg b/branch-3.9/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-home.svg b/branch-3.9/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-infoworld.svg b/branch-3.9/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-3.9/_static/img/icons/icon-integrations.svg b/branch-3.9/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-knowledge-base.svg b/branch-3.9/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-less.svg b/branch-3.9/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-live-test.svg b/branch-3.9/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-3.9/_static/img/icons/icon-mail-list.svg b/branch-3.9/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-manager.svg b/branch-3.9/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-3.9/_static/img/icons/icon-memory-management.svg b/branch-3.9/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-3.9/_static/img/icons/icon-modeling.svg b/branch-3.9/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-monitoring.svg b/branch-3.9/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-3.9/_static/img/icons/icon-networking.svg b/branch-3.9/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-3.9/_static/img/icons/icon-news.svg b/branch-3.9/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-3.9/_static/img/icons/icon-newsletter.svg b/branch-3.9/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-3.9/_static/img/icons/icon-nsql-guides.svg b/branch-3.9/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-3.9/_static/img/icons/icon-open-source.svg b/branch-3.9/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-3.9/_static/img/icons/icon-operator.svg b/branch-3.9/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-overview.svg b/branch-3.9/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-3.9/_static/img/icons/icon-partners.svg b/branch-3.9/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-3.9/_static/img/icons/icon-plus.svg b/branch-3.9/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-pricing.svg b/branch-3.9/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-3.9/_static/img/icons/icon-release-notes.svg b/branch-3.9/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-3.9/_static/img/icons/icon-resource-center.svg b/branch-3.9/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-3.9/_static/img/icons/icon-roadmap.svg b/branch-3.9/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-3.9/_static/img/icons/icon-search.svg b/branch-3.9/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.9/_static/img/icons/icon-slack.svg b/branch-3.9/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-stack-overflow.svg b/branch-3.9/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-3.9/_static/img/icons/icon-summit.svg b/branch-3.9/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/icons/icon-support.svg b/branch-3.9/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-3.9/_static/img/icons/icon-tech-talks.svg b/branch-3.9/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-3.9/_static/img/icons/icon-testing.svg b/branch-3.9/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-3.9/_static/img/icons/icon-thumbs-down.svg b/branch-3.9/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-thumbs-up.svg b/branch-3.9/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-3.9/_static/img/icons/icon-tip.svg b/branch-3.9/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-3.9/_static/img/icons/icon-training.svg b/branch-3.9/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-3.9/_static/img/icons/icon-triangle-down.svg b/branch-3.9/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.9/_static/img/icons/icon-university.svg b/branch-3.9/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-3.9/_static/img/icons/icon-users-blog.svg b/branch-3.9/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-3.9/_static/img/icons/icon-warning.svg b/branch-3.9/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-3.9/_static/img/icons/icon-webinars.svg b/branch-3.9/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-3.9/_static/img/icons/icon-whitepapers.svg b/branch-3.9/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-3.9/_static/img/icons/icon-workshop.svg b/branch-3.9/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-3.9/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-3.9/_static/img/logo-docs.svg b/branch-3.9/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-3.9/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.9/_static/img/logo-scylla-horizontal-RGB.svg b/branch-3.9/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-3.9/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-3.9/_static/img/mascots/404.jpg b/branch-3.9/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-3.9/_static/img/mascots/404.jpg differ diff --git a/branch-3.9/_static/img/mascots/scylla-3monsters.png b/branch-3.9/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-advisor-crystal.png b/branch-3.9/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-alternator.svg b/branch-3.9/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-3.9/_static/img/mascots/scylla-cloud.svg b/branch-3.9/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-3.9/_static/img/mascots/scylla-computer-3-monsters.png b/branch-3.9/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-computer-headset.png b/branch-3.9/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-cup-number-one.png b/branch-3.9/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-docs.svg b/branch-3.9/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-3.9/_static/img/mascots/scylla-drivers.svg b/branch-3.9/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-3.9/_static/img/mascots/scylla-enterprise.svg b/branch-3.9/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-3.9/_static/img/mascots/scylla-forklift-boxes.png b/branch-3.9/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-forklift-migration.png b/branch-3.9/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-gear.png b/branch-3.9/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-gear.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-hardhat.png b/branch-3.9/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-headband.png b/branch-3.9/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-headband.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-headset.png b/branch-3.9/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-headset.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-hearts.png b/branch-3.9/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-looking-down.png b/branch-3.9/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-looking-up.png b/branch-3.9/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-3.9/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-magnifying-glass.png b/branch-3.9/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-manager.svg b/branch-3.9/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-3.9/_static/img/mascots/scylla-monitor.svg b/branch-3.9/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-3.9/_static/img/mascots/scylla-movement-fast.png b/branch-3.9/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-movement.png b/branch-3.9/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-movement.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-onpremise.png b/branch-3.9/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-opensource.svg b/branch-3.9/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-3.9/_static/img/mascots/scylla-operator.svg b/branch-3.9/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-3.9/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-3.9/_static/img/mascots/scylla-plugin.png b/branch-3.9/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-release-mascot.png b/branch-3.9/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-repair.png b/branch-3.9/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-repair.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-server.png b/branch-3.9/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-server.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-sleeping.png b/branch-3.9/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-tall-measure.png b/branch-3.9/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-university.png b/branch-3.9/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-university.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-weights.png b/branch-3.9/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-weights.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-window-cleaning.png b/branch-3.9/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-with-computer-2.png b/branch-3.9/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-with-computer.png b/branch-3.9/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-with-linux.png b/branch-3.9/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-3.9/_static/img/mascots/scylla-writting.png b/branch-3.9/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-3.9/_static/img/mascots/scylla-writting.png differ diff --git a/branch-3.9/_static/img/menu.svg b/branch-3.9/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-3.9/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-3.9/_static/img/scylla-monitor.png b/branch-3.9/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-3.9/_static/img/scylla-monitor.png differ diff --git a/branch-3.9/_static/js/main.bundle.js b/branch-3.9/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-3.9/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
              • Back
              • ',backButtonPosition:"top",wrapper:"
                ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                  "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                  ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                  ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                  ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                  ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                  "],col:[2,"","
                  "],tr:[2,"","
                  "],td:[3,"","
                  "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + + + +
                  + + + + + +
                  + + +
                  + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/index.html b/branch-3.9/index.html new file mode 100644 index 000000000..a1cea745e --- /dev/null +++ b/branch-3.9/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack

                  +
                  +
                  +

                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                  +_images/monitor.png +

                  The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

                  +
                    +
                  • prometheus - collects and stores metrics

                  • +
                  • alertmanager - handles alerts

                  • +
                  • grafana - dashboard server

                  • +
                  +

                  Choose a topic to get started:

                  + +

                  For older versions of Scylla Monitoring Stack Documentation see here.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/docker_compose.html b/branch-3.9/install/docker_compose.html new file mode 100644 index 000000000..1a0cdf8b4 --- /dev/null +++ b/branch-3.9/install/docker_compose.html @@ -0,0 +1,799 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Using Docker Compose

                  +

                  Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                  +

                  Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                  +
                  +

                  Warning

                  +

                  docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                  +
                  +
                  +

                  Prerequisite

                  +

                  Make sure you have docker and docker-compose installed.

                  +
                  +
                  +

                  Setting Prometheus

                  +

                  The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                  +

                  You can use ./prometheus-config.sh to generate the file, for example:

                  +
                  ./prometheus-config.sh --compose
                  +
                  +
                  +

                  For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                  +
                  +
                  +

                  Setting Grafana Provisioning

                  +

                  Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                  +
                  +

                  Grafana Data-Source file

                  +

                  Run the following command to update the datasource:

                  +
                  ./grafana-datasource.sh --compose
                  +
                  +
                  +

                  You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                  +
                  +
                  +

                  Grafana Dashboard Load file

                  +

                  To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                  +
                  ./generate-dashboards.sh -t -v 2020.1
                  +
                  +
                  +

                  This command generates the files under: grafana/provisioning/dashboards/

                  +
                  +
                  +
                  +

                  Docker Compose file

                  +

                  You can use the following example as a base for your docker compose.

                  +

                  Pass the following to a file called docker-compose.yml

                  +
                  services:
                  +  alertmanager:
                  +    container_name: aalert
                  +    image: prom/alertmanager:v0.21.0
                  +    ports:
                  +    - 9093:9093
                  +    volumes:
                  +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                  +  grafana:
                  +    container_name: agraf
                  +    environment:
                  +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                  +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                  +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                  +    # This is where you set Grafana security
                  +    - GF_AUTH_BASIC_ENABLED=false
                  +    - GF_AUTH_ANONYMOUS_ENABLED=true
                  +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                  +    - GF_SECURITY_ADMIN_PASSWORD=admin
                  +    image: grafana/grafana:7.3.5
                  +    ports:
                  +    - 3000:3000
                  +    user: 1000:1000
                  +    volumes:
                  +    - ./grafana/build:/var/lib/grafana/dashboards
                  +    - ./grafana/plugins:/var/lib/grafana/plugins
                  +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                  +    # Uncomment the following line for grafana persistency
                  +    # - path/to/grafana/dir:/var/lib/grafana
                  +  loki:
                  +    command:
                  +    - --config.file=/mnt/config/loki-config.yaml
                  +    container_name: loki
                  +    image: grafana/loki:2.0.0
                  +    ports:
                  +    - 3100:3100
                  +    volumes:
                  +    - ./loki/rules:/etc/loki/rules
                  +    - ./loki/conf:/mnt/config
                  +  promotheus:
                  +    command:
                  +    - --config.file=/etc/prometheus/prometheus.compose.yml
                  +    container_name: aprom
                  +    image: prom/prometheus:v2.18.1
                  +    ports:
                  +    - 9090:9090
                  +    volumes:
                  +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                  +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                  +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                  +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                  +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                  +    # Uncomment the following line for prometheus persistency 
                  +    # - path/to/data/dir:/prometheus/data
                  +  promtail:
                  +    command:
                  +    - --config.file=/etc/promtail/config.yml
                  +    container_name: promtail
                  +    image: grafana/promtail:2.0.0
                  +    ports:
                  +    - 1514:1514
                  +    - 9080:9080
                  +    volumes:
                  +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                  +version: '3'
                  +
                  +
                  +
                  +

                  Start and Stop

                  +

                  To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/index.html b/branch-3.9/install/index.html new file mode 100644 index 000000000..af1a190eb --- /dev/null +++ b/branch-3.9/install/index.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Download and Install Scylla Monitoring Stack

                  +
                  +
                  +

                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                  +

                  Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/min-prod-hw.html b/branch-3.9/install/min-prod-hw.html new file mode 100644 index 000000000..f6b0e394e --- /dev/null +++ b/branch-3.9/install/min-prod-hw.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Minimal Production System Recommendations

                  +
                    +
                  • CPU - at least 2 physical cores/ 4vCPUs

                  • +
                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                  • +
                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                  • +
                  • Network - 1GbE/10GbE preferred

                  • +
                  +
                  +

                  Calculating Prometheus Minimal Disk Space requirement

                  +

                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                  +

                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                  +

                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                  +
                  6 * 16 * 15 * 12MB ~ 16GB
                  +
                  +
                  +

                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                  +
                  +
                  +

                  Calculating Prometheus Minimal Memory Space requirement

                  +

                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                  +

                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/monitor_without_docker.html b/branch-3.9/install/monitor_without_docker.html new file mode 100644 index 000000000..af10f3ce0 --- /dev/null +++ b/branch-3.9/install/monitor_without_docker.html @@ -0,0 +1,1050 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Deploying Scylla Monitoring Stack Without Docker

                  +
                  +

                  Introduction

                  +

                  The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                  +

                  Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                  +

                  Scylla Monitoring uses the following components:

                  +
                    +
                  • Alertmanager

                  • +
                  • Grafana Loki

                  • +
                  • Prometheus

                  • +
                  • Grafana

                  • +
                  +

                  The common scenario for users who use their own standalone installation, is they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                  +

                  We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                  +
                  +
                  +

                  Minimal Production System Recommendations

                  +
                    +
                  • CPU - at least 2 physical cores/ 4vCPUs

                  • +
                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                  • +
                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                  • +
                  • Network - 1GbE/10GbE preferred

                  • +
                  +
                  +

                  Calculating Prometheus Minimal Disk Space requirement

                  +

                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                  +

                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                  +

                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                  +
                  6 * 16 * 15 * 12MB ~ 16GB
                  +
                  +
                  +

                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                  +
                  +
                  +

                  Calculating Prometheus Minimal Memory Space requirement

                  +

                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                  +

                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                  +

                  The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                  +
                  +

                  Note

                  +

                  Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                  +
                  +
                  +
                  +
                  +

                  Install Scylla Monitoring Stack

                  +

                  The following procedure uses a CentOS 7 based instance

                  +
                    +
                  1. Download the latest Scylla Monitoring Stack release.

                  2. +
                  +

                  wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-3.9.0.tar.gz

                  +
                    +
                  1. Open the tar

                  2. +
                  +

                  tar -xvf scylla-monitoring-*.tar.gz

                  +
                  +
                  +

                  Install Alertmanager

                  +

                  Tested with alertmanager 0.22.2 version

                  +
                    +
                  1. Install alertmanager

                  2. +
                  +
                  wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                  +tar -xvf alertmanager-*.linux-amd64.tar.gz
                  +
                  +
                  +
                    +
                  1. Copy the following file: rule_config.yml from scylla-monitoring-scylla-monitoring-3.9.0/prometheus directory to alertmanager.yml in the alertmanager installation directory.

                  2. +
                  +

                  For example:

                  +
                  cp -p /home/centos/scylla-monitoring-scylla-monitoring-3.9.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                  +
                  +
                  +
                    +
                  1. Start the Alertmanager

                  2. +
                  +

                  For example:

                  +
                  cd alertmanager-0.22.2.linux-amd64
                  +./alertmanager
                  +
                  +
                  +
                    +
                  1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                  2. +
                  +

                  For example:

                  +
                  http://192.168.135.166:9093/
                  +
                  +
                  +../_images/alertmanager.png +
                  +
                  +

                  Install Grafana Loki

                  +

                  Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                  +

                  We recomand using Loki with containers, but you can install it locally as described in Loki installation

                  +

                  You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                  +

                  Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                  +

                  Loki Related files

                  +

                  Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                  +
                  mkdir -p /etc/loki/rules
                  +mkdir -p /etc/loki/config
                  +cp loki/rules/* /etc/loki/rules
                  +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                  +
                  +
                  +

                  Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                  +

                  Promtail Related files

                  +

                  Promtail has a configuration file. You need to copy and modify the configuration.

                  +
                  mkdir -p /etc/promtail/
                  +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                  +
                  +
                  +

                  Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                  +
                  +
                  +

                  Install Prometheus

                  +

                  Tested with Prometheus version 2.27.1

                  +
                  +

                  Note

                  +

                  If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                  +
                  +
                    +
                  1. Install Prometheus

                  2. +
                  +
                  wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                  +tar -xvf prometheus-*.linux-amd64.tar.gz
                  +
                  +
                  +

                  2. Create Data and Config directories +.. code-block:: shell

                  +
                  +

                  mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                  +
                  +
                    +
                  1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from scylla-monitoring-scylla-monitoring-3.9.0/prometheus directory to Prometheus installation directory.

                  2. +
                  +

                  Copy prometheus/prometheus.yml.template to prometheus.yml

                  +

                  For example:

                  +
                  cp scylla-monitoring-scylla-monitoring-3.9.0/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
                  +cp scylla-monitoring-scylla-monitoring-3.9.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                  +
                  +
                  +
                    +
                  1. Edit the prometheus.yml file to point to the correct static data sources.

                  2. +
                  +
                  +

                  Note

                  +

                  Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                  +
                  +
                  vi /etc/prometheus/prometheus.yml
                  +
                  +
                  +

                  Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                  +

                  For example if the alertmanager will run on the same host:

                  +
                  alerting:
                  +   alertmanagers:
                  +   - static_configs:
                  +       - targets:
                  +           - 127.0.0.1:9093
                  +
                  +
                  +

                  Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                  +

                  For example the scrape config for Scylla:

                  +
                  global:
                  +  scrape_interval: 5s # By default, scrape targets every 5 second.
                  +  scrape_timeout: 4s # Timeout before trying to scape a target again
                  +
                  +  # Attach these labels to any time series or alerts when communicating with
                  +  # external systems (federation, remote storage, Alertmanager).
                  +  external_labels:
                  +    monitor: 'scylla-monitor'
                  +
                  +scrape_configs:
                  +- job_name: scylla
                  +  honor_labels: false
                  +  file_sd_configs:
                  +    - files:
                  +      - /etc/scylla.d/prometheus/scylla_servers.yml
                  +  relabel_configs:
                  +    - source_labels: [__address__]
                  +      regex:  '([^:]+)'
                  +      target_label: __address__
                  +      replacement: '${1}:9180'
                  +
                  +    - source_labels: [__address__]
                  +      regex:  '(.*):.+'
                  +      target_label: instance
                  +      replacement: '${1}'
                  +
                  +
                  +
                    +
                  1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                  2. +
                  +
                  +

                  Note

                  +

                  There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                  +
                  +

                  An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                  +
                  +

                  Note

                  +

                  You must have both files even if you are not using Scylla Manager

                  +
                  +

                  Add the labels for the cluster and data-center

                  +

                  scylla_servers.yml:

                  +

                  For example:

                  +
                  cat scylla_servers.yml
                  +# List Scylla end points
                  +
                  +- targets:
                  +  - 192.168.66.6
                  +  - 192.168.66.244
                  +  labels:
                  +    cluster: cluster1
                  +    dc: dc1
                  +- targets:
                  +    - 172.17.0.3
                  +  labels:
                  +    cluster: cluster1
                  +    dc: dc2
                  +
                  +
                  +
                  +

                  Note

                  +

                  See the previous note about deprecating the node_exporter_servers.yml file.

                  +
                  +

                  scylla_manager_server.yml

                  +

                  For example:

                  +
                  - targets:
                  +  - 127.0.0.1:5090
                  +
                  +
                  +
                    +
                  1. Start Prometheus server:

                  2. +
                  +

                  For example:

                  +
                  cd scylla-monitoring-scylla-monitoring-3.9.0/
                  +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                  +
                  +
                  +

                  Data should start accumulate on: /prometheus/data

                  +
                    +
                  1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                  2. +
                  +

                  For example:

                  +
                  http://192.168.135.166:9090/
                  +
                  +
                  +../_images/1.png +

                  Prometheus console should be visible

                  +
                    +
                  1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                  2. +
                  +

                  For example:

                  +

                  node_memory_MemFree

                  +../_images/2.png +

                  And

                  +

                  scylla_reactor_utilization

                  +../_images/3.png +

                  At this point Scylla is emitting the metrics and Prometheus is able to store them.

                  +
                  +
                  +

                  Install Grafana

                  +

                  Tested with Grafna 7.5.7

                  +
                    +
                  1. Install Grafana based on the instructions here

                  2. +
                  +

                  Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                  +
                    +
                  1. Access Scylla-Grafana-monitoring directory

                  2. +
                  +

                  cd scylla-monitoring-scylla-monitoring-3.9.0/

                  +
                    +
                  1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                  2. +
                  +
                  sudo cp -r grafana/plugins /var/lib/grafana/
                  +
                  +
                  +

                  If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                  +

                  For example:

                  +
                  cp -r grafana/plugins ../grafana-7.5.7/public/app
                  +
                  +
                  +
                    +
                  1. Provision the Dashboards

                  2. +
                  +

                  For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                  +

                  For Grafana installed with yum install

                  +
                  sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                  +sudo mkdir -p /var/lib/grafana/dashboards
                  +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                  +
                  +
                  +

                  For Grafana installed from packages

                  +
                  cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                  +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                  +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                  +
                  +
                  +

                  Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                  +
                  +

                  Note

                  +

                  A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                  +
                  +
                    +
                  1. Set the data source by copy datasource.yml and edit it

                  2. +
                  +
                  sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                  +
                  +
                  +

                  For Grafana installed from packages

                  +
                  cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                  +
                  +
                  +

                  You should set the Prometheus and the alertmanager IP and port.

                  +

                  For example

                  +
                  sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                  +apiVersion: 1
                  +datasources:
                  + - name: prometheus
                  +   type: prometheus
                  +   url: http://192.168.135.167:9090
                  +   access: proxy
                  +   basicAuth: false
                  +
                  + - name: alertmanager
                  +   type: camptocamp-prometheus-alertmanager-datasource
                  +   orgId: 1
                  +   typeLogoUrl: public/img/icn-datasource.svg
                  +   access: proxy
                  +   url: http://192.168.135.166:9093
                  +   password:
                  +   user:
                  +   database:
                  +   basicAuth:
                  +   isDefault:
                  +   jsonData:
                  +     severity_critical: '4'
                  +     severity_high: '3'
                  +     severity_warning: '2'
                  +     severity_info: '1'
                  +
                  +
                  +
                    +
                  1. Start the Grafana service

                  2. +
                  +

                  For Grafana installed with yum install

                  +

                  sudo service grafana-server start

                  +

                  For Grafana installed from packages:

                  +

                  cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                  +

                  Edit scylla.ini to reflect the right paths in the paths section of the file.

                  +
                  plugins = /home/centos/grafana-7.5.7/data/plugins
                  +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                  +
                  +
                  +

                  Start the server:

                  +
                  cd /home/centos/grafana-7.5.7/
                  +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                  +
                  +
                  +
                    +
                  1. Make sure Grafana is running

                  2. +
                  +

                  Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                  +../_images/grafana.png +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/monitoring_stack.html b/branch-3.9/install/monitoring_stack.html new file mode 100644 index 000000000..2baedee96 --- /dev/null +++ b/branch-3.9/install/monitoring_stack.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Install Scylla Monitoring Stack

                  + +

                  This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API.

                  +

                  The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                  +

                  For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                  +
                  +

                  Minimal Production System Recommendations

                  +
                    +
                  • CPU - at least 2 physical cores/ 4vCPUs

                  • +
                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                  • +
                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                  • +
                  • Network - 1GbE/10GbE preferred

                  • +
                  +
                  +

                  Calculating Prometheus Minimal Disk Space requirement

                  +

                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                  +

                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                  +

                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                  +
                  6 * 16 * 15 * 12MB ~ 16GB
                  +
                  +
                  +

                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                  +
                  +
                  +

                  Calculating Prometheus Minimal Memory Space requirement

                  +

                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                  +

                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                  +
                  +
                  +
                  +

                  Prerequisites

                  +
                    +
                  • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

                  • +
                  • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                  • +
                  + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  Scylla Monitoring Stack Compatibility Matrix

                  Scylla Monitoring Stack Version

                  Prometheus Version

                  Grafana Version

                  3.9

                  2.29.1

                  8.1.1

                  3.8

                  2.27.1

                  7.5.7

                  3.7

                  2.25.2

                  7.4.0

                  3.6

                  2.18.1

                  7.3.5

                  3.5

                  2.18.1

                  7.1.5

                  3.4

                  2.18.1

                  6.7.3

                  +
                  +
                  +

                  Docker Post Installation

                  +

                  Docker post installation guide can be found here

                  +
                  +

                  Note

                  +

                  Avoid running the container as root.

                  +
                  +

                  To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                  +
                    +
                  1. Create the Docker group.

                  2. +
                  +
                  sudo groupadd docker
                  +
                  +
                  +
                    +
                  1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                  2. +
                  +
                  sudo usermod -aG docker $USER
                  +
                  +
                  +
                    +
                  1. Start Docker by calling:

                  2. +
                  +
                  sudo systemctl enable docker
                  +
                  +
                  +
                  +
                  +

                  Install Scylla Monitoring Stack

                  +

                  Procedure

                  +
                    +
                  1. Download and extract the latest Scylla Monitoring Stack binary;.

                  2. +
                  +
                  wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.9.2.tar.gz
                  +tar -xvf scylla-monitoring-3.9.2.tar.gz
                  +cd scylla-monitoring-scylla-monitoring-3.9.2
                  +
                  +
                  +

                  As an alternative, you can clone and use the Git repository directly.

                  +
                  git clone https://github.com/scylladb/scylla-monitoring.git
                  +cd scylla-monitoring
                  +git checkout branch-3.9
                  +
                  +
                  +
                    +
                  1. Start Docker service if needed

                  2. +
                  +
                  sudo systemctl restart docker
                  +
                  +
                  +
                  +
                  +

                  Configure Scylla Monitoring Stack

                  +

                  To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                  +

                  This configuration can be done from files, or using the Consul api.

                  +

                  Scylla Manager 2.0 and higher supports the Consul API.

                  +
                  +

                  Configure Scylla nodes from files

                  +
                    +
                  1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                  2. +
                  +
                  +

                  Note

                  +

                  It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                  +
                  +

                  For example:

                  +
                  - targets:
                  +      - 172.17.0.2
                  +      - 172.17.0.3
                  +  labels:
                  +      cluster: cluster1
                  +      dc: dc1
                  +
                  +
                  +
                  +

                  Note

                  +

                  If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                  +
                  +

                  Using IPV6

                  +

                  To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                  +

                  For example:

                  +
                  - targets:
                  +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                  +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                  +  labels:
                  +      cluster: cluster1
                  +      dc: dc1
                  +
                  +
                  +
                  +

                  Note

                  +

                  For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                  +
                  +

                  For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                  +
                  +

                  Note

                  +

                  By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                  +
                  +

                  If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                  +

                  For example:

                  +
                  ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                  +
                  +
                  +

                  Mark the different Data Centers with Labels.

                  +

                  As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                  +

                  You can use the genconfig.py script to generate the server file. For example:

                  +
                  ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                  +
                  +
                  +

                  This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                  +

                  OR

                  +

                  The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                  +
                  nodetool status | ./genconfig.py -NS
                  +
                  +
                  +

                  2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                  +

                  You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                  +

                  For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                  +
                  # List Scylla Manager end points
                  +
                  +- targets:
                  +  - 172.17.0.7:5090
                  +
                  +
                  +

                  Note that you do not need to add labels to the Scylla Manager targets.

                  +
                  +
                  +

                  Configure Scylla nodes using Scylla-Manager Consul API

                  +

                  Scylla Manager 2.0 has a Consul like API.

                  +

                  When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                  +

                  For example:

                  +
                  ./start-all.sh -L 10.10.0.1
                  +
                  +
                  +
                  +

                  Note

                  +

                  If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                  +
                  +
                  +
                  +

                  Connecting Scylla-Monitoring to Scylla

                  +

                  Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                  +

                  You can limit the user to read only, currently it only read table from the system keyspace.

                  +

                  To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                  +

                  Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                  +
                  +
                  +

                  Use an external directory for the Prometheus data directory

                  +

                  The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                  +
                  +

                  Note

                  +

                  Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                  +
                  +

                  If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                  +

                  In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                  +
                  +
                  +

                  Add Additional Prometheus Targets

                  +

                  There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                  +

                  The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                  +

                  You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                  +
                  - job_name: 'myservice'
                  +  # Override the global default and scrape targets from this job every 5 seconds.
                  +  scrape_interval: 5s
                  +  static_configs:
                  +    - targets:
                  +      - 17.0.0.1:7000
                  +
                  +
                  +
                  +
                  +
                  +

                  Start and Stop Scylla Monitoring Stack

                  +
                  +

                  Start

                  +
                  ./start-all.sh -d prometheus_data
                  +
                  +
                  +
                  +
                  +

                  Stop

                  +
                  ./kill-all.sh
                  +
                  +
                  +
                  +
                  +

                  Start a Specific Scylla Monitoring Stack Version

                  +

                  By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                  +

                  You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                  +

                  Multiple versions are supported. For example:

                  +
                  ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                  +
                  +
                  +

                  will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                  +
                  +
                  +

                  Accessing the localhost

                  +

                  The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                  +
                  ./start-all.sh -l -d prometheus-data
                  +
                  +
                  +
                  +
                  +

                  Configure rsyslog on each Scylla node

                  +

                  generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                  +

                  Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                  +

                  Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                  +

                  If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                  +
                  if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                  +
                  +
                  +

                  Restart rsyslog for the configuration to take effect.

                  +
                  systemctl restart rsyslog
                  +
                  +
                  +
                  +
                  +
                  +

                  View Grafana Dashboards

                  +

                  Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/start_all.html b/branch-3.9/install/start_all.html new file mode 100644 index 000000000..a5ad2ae74 --- /dev/null +++ b/branch-3.9/install/start_all.html @@ -0,0 +1,739 @@ + + + + + + + + + + + + + The start-all.sh command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  The start-all.sh command

                  +

                  Scylla Monitoring Stack is container-based, the simplest way to configure and start the monitoring is with the start-all.sh command.

                  +

                  The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                  +
                  +

                  General Options

                  +

                  -h Help, Print the help, and exit.

                  +

                  –version print the current Scylla-Monitoring stack version, and exit.

                  +

                  -l local. Use the host network. This is important when one of the containers need access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default their local IP address (127.0.0.1) is the container local IP address. +You cannot use port mapping when using the -l flag

                  +

                  -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                  +

                  -D encapsulate docker param Allows passing additional parameters to all the docker containers.

                  +

                  –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                  +
                  + + +
                  +

                  Alert Manager

                  +

                  alertmanager handles the alerts and takes the following parameters:

                  +

                  -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                  +

                  -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                  +

                  -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/install/thanos.html b/branch-3.9/install/thanos.html new file mode 100644 index 000000000..c9ef7d22c --- /dev/null +++ b/branch-3.9/install/thanos.html @@ -0,0 +1,742 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Using Thanos as Data Source With Scylla Monitoring Stack

                  +

                  Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additiuonal functionalities such as:

                  +
                    +
                  • High-availability.

                  • +
                  • Horizontal scaling.

                  • +
                  • Backup.

                  • +
                  +

                  The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                  +

                  The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                  +
                  +

                  Using Thanos As a Prometheus Aggregator

                  +

                  There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                  +
                  +

                  Prometheus Configuration

                  +

                  We will assume you have two Prometheus servers running.

                  +
                    +
                  1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                  2. +
                  3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                  4. +
                  +
                  +
                  +

                  Thanos sidecar

                  +

                  The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                  +
                  docker run -d \
                  + -v /path/to/prom/dir:/data/prom:z \
                  + -i --name sidecar thanosio/thanos \
                  + sidecar \
                  + --grpc-address=0.0.0.0:10911 \
                  + --grpc-grace-period=1s \
                  + --http-address=0.0.0.0:10912 \
                  + --http-grace-period=1s \
                  + --prometheus.url=http://prometheus-ip:9090 \
                  + --tsdb.path=/data/prom \
                  + -p 10912:10912 \
                  + -p 10911:10911
                  +
                  +
                  +

                  After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                  +
                  +
                  +

                  Thanos query

                  +

                  Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                  +
                  docker run -d \
                  + --name thanos -- thanosio/thanos \
                  +   query \
                  +   --debug.name=query0 \
                  +   --log.level=debug \
                  +   --grpc-address=0.0.0.0:10903 \
                  +   --grpc-grace-period=1s \
                  +   --http-address=0.0.0.0:10904 \
                  +   --http-grace-period=1s \
                  +   --query.replica-label=prometheus \
                  +   --store={ip1}:10911 --store={ip2}:10911
                  +
                  +
                  +

                  After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                  +
                  +
                  +

                  Update Scylla Data source

                  +

                  The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                  +

                  The file you edit is a template file that replaces the file Grafana uses, next time you start.

                  +

                  Restart the Scylla Monitoring Stack it should now use Thanos.

                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/intro.html b/branch-3.9/intro.html new file mode 100644 index 000000000..d7aa55000 --- /dev/null +++ b/branch-3.9/intro.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack

                  +

                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                  +_images/monitor.png +

                  The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers:

                  +
                    +
                  • prometheus - Collects and stores metrics

                  • +
                  • grafan-loki - Parses logs and generates metrics and alerts

                  • +
                  • alertmanager - Handles alerts

                  • +
                  • grafana - Dashboards server

                  • +
                  +

                  A few optional components are used for additional services

                  +
                    +
                  • grafana-image-renderer - Allows you to download a dashboard as an image.

                  • +
                  • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                  • +
                  +
                  +

                  High Level Architecture

                  +_images/monitoring_stack.png +

                  We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the node_exporter agent that runs on the Scylla server.

                  +

                  We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers.

                  +

                  The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                  +

                  We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL.

                  +

                  Choose a topic to get started:

                  + +

                  For older versions of Scylla Monitoring Stack Documentation see here.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/objects.inv b/branch-3.9/objects.inv new file mode 100644 index 000000000..0bb5ab67a Binary files /dev/null and b/branch-3.9/objects.inv differ diff --git a/branch-3.9/procedures/alerts/alerting.html b/branch-3.9/procedures/alerts/alerting.html new file mode 100644 index 000000000..b0e9a7c86 --- /dev/null +++ b/branch-3.9/procedures/alerts/alerting.html @@ -0,0 +1,738 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Alerting

                  +

                  Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                  +

                  You can read more about Prometheus alerting here

                  +

                  By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                  +

                  In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                  +

                  The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                  +../../_images/monitoring_stack1.png +
                  +

                  Prometheus Alerts

                  +

                  The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                  +

                  Each alert consists of:

                  +
                    +
                  • Name

                  • +
                  • What happened

                  • +
                  • For how long

                  • +
                  • What to report

                  • +
                  +

                  For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                  +
                  - alert: InstanceDown
                  +  expr: up == 0
                  +  for: 60s
                  +  labels:
                  +    severity: "2"
                  +  annotations:
                  +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                  +    summary: Instance {{ $labels.instance }} down
                  +
                  +
                  +

                  The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                  +

                  The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                  +

                  The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                  +

                  annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                  +
                  +
                  +

                  Alertmanager

                  +

                  The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                  +

                  The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                  +
                    +
                  • Routes: Represent a routing tree, the most specific rule, wins

                  • +
                  • Inhibition: Mute an alert, based on another alert

                  • +
                  • Receiver: Send a notification via email, sluck, etc’

                  • +
                  +

                  Check the Alertmanager documentation for details on how to specify a specific receiver.

                  +

                  In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                  +
                  +
                  +

                  Tips When Adding an Alert

                  +

                  It’s worse having an alert that does not work, than not having an alert at all

                  +

                  There are multiple ways you can use to make sure your alert is set correctly:

                  +
                    +
                  • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                  • +
                  • Force the alert to be active by reducing the limits or the duration.

                  • +
                  • When possible simulate the actual scenario and see that the alert works as expected.

                  • +
                  +

                  For example, low available disk space.

                  +

                  Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                  +

                  Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                  +

                  Starting with a simple working expression helps you bisect problems.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/procedures/alerts/index.html b/branch-3.9/procedures/alerts/index.html new file mode 100644 index 000000000..8198619bb --- /dev/null +++ b/branch-3.9/procedures/alerts/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Alert Manager

                  +
                  +
                  +

                  Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/procedures/index.html b/branch-3.9/procedures/index.html new file mode 100644 index 000000000..e24003769 --- /dev/null +++ b/branch-3.9/procedures/index.html @@ -0,0 +1,655 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Procedures

                  +
                  +
                  +

                  There are several reference guides available which give additional information. Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/procedures/updating_dashboard.html b/branch-3.9/procedures/updating_dashboard.html new file mode 100644 index 000000000..959392b7f --- /dev/null +++ b/branch-3.9/procedures/updating_dashboard.html @@ -0,0 +1,948 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Adding and Modifying Dashboards

                  +

                  The following document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                  +

                  It will explain about Scylla Monitoring Stack dashboard templates and how to modify them.

                  + +
                  +

                  General Limitations

                  +

                  Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in Grafana internal storage. +There are consistency issues here, between restarts and between upgrades.

                  +
                  +

                  consistency between restarts

                  +

                  By default, Grafana internal storage is inside the container. That means whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will be gone. + If you are doing and saving changes from the GUI make sure to configure an external directory for Grafana.

                  +
                  +
                  +

                  consistency between upgrades

                  +

                  As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden.For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                  +
                  +

                  Note

                  +

                   You can save a dashboard change you made from the GUI, but it can be overridden and should be avoided.

                  +
                  +

                  At large, we suggest maintaining your dashboards as files, as Scylla Monitor does.

                  +
                  +
                  +
                  +

                  Using templated Dashboards

                  +

                  Why does Scylla Monitor use dashboard templates?

                  +

                  We found the Grafana dashboards Json format too verbose to be maintainable.

                  +

                  Each element in the dashboard file (Each Json object) contains all of its attributes and values.

                  +

                  For example a typical graph panel would look like:

                  +
                  {
                  +    "aliasColors": {},
                  +    "bars": false,
                  +    "datasource": "prometheus",
                  +    "editable": true,
                  +    "error": false,
                  +    "fill": 0,
                  +    "grid": {
                  +        "threshold1": null,
                  +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                  +        "threshold2": null,
                  +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                  +    },
                  +    "gridPos": {
                  +        "h": 6,
                  +        "w": 10,
                  +        "x": 0,
                  +        "y": 4
                  +    },
                  +    "id": 2,
                  +    "isNew": true,
                  +    "legend": {
                  +        "avg": false,
                  +        "current": false,
                  +        "max": false,
                  +        "min": false,
                  +        "show": false,
                  +        "total": false,
                  +        "values": false
                  +    },
                  +    "lines": true,
                  +    "linewidth": 2,
                  +    "links": [],
                  +    "nullPointMode": "connected",
                  +    "percentage": false,
                  +    "pointradius": 5,
                  +    "points": false,
                  +    "renderer": "flot",
                  +    "seriesOverrides": [
                  +        {}
                  +    ],
                  +    "span": 5,
                  +    "stack": false,
                  +    "steppedLine": false,
                  +    "targets": [
                  +        {
                  +            "expr": "sum(node_filesystem_avail) by (instance)",
                  +            "intervalFactor": 1,
                  +            "legendFormat": "",
                  +            "refId": "A",
                  +            "step": 1
                  +        }
                  +    ],
                  +    "timeFrom": null,
                  +    "timeShift": null,
                  +    "title": "Available Disk Size",
                  +    "tooltip": {
                  +        "msResolution": false,
                  +        "shared": true,
                  +        "sort": 0,
                  +        "value_type": "cumulative"
                  +    },
                  +    "transparent": false,
                  +    "type": "graph",
                  +    "xaxis": {
                  +        "show": true
                  +    },
                  +    "yaxes": [
                  +        {
                  +            "format": "percent",
                  +            "logBase": 1,
                  +            "max": 101,
                  +            "min": 0,
                  +            "show": true
                  +        },
                  +        {
                  +            "format": "short",
                  +            "logBase": 1,
                  +            "max": null,
                  +            "min": null,
                  +            "show": true
                  +        }
                  +    ]
                  +}
                  +
                  +
                  +

                  As you can imagine, most panels would have similar values.

                  +

                  To reduce the redundancy of Grafana JSON format, we added dashboard templates.

                  +
                  +

                  The template class system

                  +

                  Scylla Monitoring Stack dashboard templates use class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                  +

                  The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherit class can add or override inherited attributes.

                  +

                  In the template file, you can also add or override attributes.

                  +

                  The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                  +

                  When generating dashboards, each class will be replaced by its definition.

                  +

                  For example row in the type.json defined

                  +
                  {
                  + "base_row": {
                  +     "collapse": false,
                  +     "editable": true
                  + },
                  + "row": {
                  +     "class": "base_row",
                  +     "height": "250px"
                  + }
                  + }
                  +
                  +
                  +

                  In a Template it will be used like

                  +
                  {
                  +     "class": "row",
                  +     "height": "150px",
                  +     "panels": [
                  +     ]
                  +}
                  +
                  +
                  +

                  The output will be

                  +
                  {
                  +     "class": "row",
                  +     "collapse": false,
                  +     "editable": true,
                  +     "height": "150px",
                  +     "panels": [
                  +
                  +     ]
                  +}
                  +
                  +
                  +

                  We can see that the template added the panels attribute and override the height attribute.

                  +
                  +
                  +

                  Panel example

                  +

                  Look at the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                  +
                  {
                  +     "class": "row",
                  +     "panels": [
                  +         {
                  +             "class": "bytes_panel",
                  +             "span": 3,
                  +             "targets": [
                  +                 {
                  +                     "expr": "sum(node_filesystem_avail) by (instance)",
                  +                     "intervalFactor": 1,
                  +                     "legendFormat": "",
                  +                     "metric": "",
                  +                     "refId": "A",
                  +                     "step": 1
                  +                 }
                  +             ],
                  +             "title": "Available Disk Size"
                  +         }
                  +     ]
                  +}
                  +
                  +
                  +

                  In the example, we used the bytes_panel class that generate a graph with bytes as units (that would mean that your +Y axis unit would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’)

                  +

                  You can also see that we override the span attribute to set the panel size.

                  +

                  To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                  +
                  +
                  +

                  Grafana Formats and Layouts

                  +

                  The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                  +

                  Starting from Grafana version 5.0 and later, rows are no longer supported, it was replaced with a layout that uses +absolute positions (ie. X,Y, height, width).

                  +

                  The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                  +

                  To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                  +

                  The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                  +

                  you can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                  +

                  gridPos has the following attributes:

                  +
                  {
                  +   "x": 0,
                  +   "y": 0,
                  +   "w": 24,
                  +   "h": 4
                  + }
                  +
                  +
                  +

                  When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                  +
                  {
                  +   "gridPos": {
                  +      "h": 2
                  +    }
                  +}
                  +
                  +
                  +
                  +
                  +

                  Generating the dashboards from templates (generate-dashboards.sh)

                  +
                  +

                  Prerequisite

                  +

                  Python 2.7

                  +

                  make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                  +

                  Use the -h flag to get help information.

                  +

                  You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                  +

                  When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                  +

                  For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                  +

                  .\generate-dashboards.sh -v 2020.1

                  +
                  +

                  Note

                  +

                  generate-dashboards.sh will update the dashboards in place, no need for a restart for the changes to take effect, just refresh the dashboard.

                  +
                  +
                  +
                  +
                  +

                  Validation

                  +

                  After making changes to a template, run the generate_generate-dashboards.sh you should see that it run without any errors.

                  +

                  Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/reference/index.html b/branch-3.9/reference/index.html new file mode 100644 index 000000000..cf40dab38 --- /dev/null +++ b/branch-3.9/reference/index.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Reference Guide

                  +
                  +
                  +

                  There are several reference guides available which give additional information. Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/reference/matrix.html b/branch-3.9/reference/matrix.html new file mode 100644 index 000000000..89b1cc0c3 --- /dev/null +++ b/branch-3.9/reference/matrix.html @@ -0,0 +1,783 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Support Matrix

                  +

                  The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                  + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                  Scylla Monitoring Stack Version

                  Scylla Open Source Version

                  Scylla Enterprise Version

                  Node_exporter[1] Version

                  Scylla Manager Version

                  3.9

                  4.3, 4.4, 4.5, 4.6

                  2020.1, 2021.1

                  0.17

                  2.3, 2.4, 2.5

                  3.8

                  4.3, 4.4, 4.5

                  2020.1, 2021.1

                  0.17

                  2.3, 2.4, 2.5

                  3.7

                  4.2, 4.3, 4.4

                  2019.1, 2020.1, 2021.1

                  0.17

                  2.2, 2.3

                  3.6.3

                  4.2, 4.3, 4.4

                  2019.1, 2020.1, 2021.1

                  0.17

                  2.2, 2.3, 2.1

                  3.6

                  4.1, 4.2, 4.3

                  2019.1, 2020.1

                  0.17

                  2.1, 2.2, 2.3

                  3.6.1

                  4.1, 4.2, 4.3

                  2019.1, 2020.1

                  0.17

                  2.1, 2.2

                  3.6.1

                  4.1, 4.2, 4.3, 4.4

                  2019.1, 2020.1

                  0.17

                  2.1, 2.2

                  3.5

                  3.3, 4.0, 4.1, 4.2

                  2019.1, 2020.1

                  0.17

                  2.0, 2.1, 2.2

                  3.4.3

                  3.3, 4.0, 4.1, 4.2

                  2019.1, 2020.1

                  0.17

                  2.0, 2.1

                  3.4

                  3.3, 4.0, 4.1

                  2018.1, 2019.1

                  0.17

                  2.0, 2.1

                  3.3

                  3.1, 3.2, 3.3, 4.0

                  2018.1, 2019.1

                  0.17

                  1.4, 2.0, 2.1

                  3.2

                  3.1, 3.2, 3.3

                  2018.1, 2019.1

                  0.17

                  1.4, 2.0

                  3.1

                  2.3, 3.0, 3.1, 3.2

                  2018.1, 2019.1

                  0.17

                  1.3, 1.4, 2.0

                  3.0

                  2.3, 3.0, 3.1, 3.2

                  2018.1, 2019.1

                  0.17

                  1.3, 1.4

                  2.4

                  2.3, 3.0, 3.1

                  2018.1, 2019.1

                  0.14, 0.17

                  1.3, 1.4

                  2.3

                  2.3, 3.0

                  2018.1, 2019.1

                  0.14, 0.17

                  1.3

                  2.2

                  2.3, 3.0

                  2018.1, 2019.1

                  0.14, 0.17

                  1.3

                  2.1

                  2.3, 3.0

                  2018.1

                  0.14, 0.17

                  1.3

                  +

                  [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/reference/monitoring_apis.html b/branch-3.9/reference/monitoring_apis.html new file mode 100644 index 000000000..dee4dc297 --- /dev/null +++ b/branch-3.9/reference/monitoring_apis.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Interfaces

                  +

                  Scylla exposes two interfaces for online monitoring, as described below

                  +
                  +

                  Prometheus

                  +

                  By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                  +

                  For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack

                  +

                  You can change the Prometheus listening address and port in scylla.yaml file

                  +
                  # prometheus port
                  +# By default, Scylla opens prometheus API port on port 9180
                  +# setting the port to 0 will disable the prometheus API.
                  +prometheus_port: 9180
                  +#
                  +# prometheus address
                  +# By default, Scylla binds all interfaces to the prometheus API
                  +# It is possible to restrict the listening address to a specific one
                  +prometheus_address: 0.0.0.0
                  +
                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/robots.txt b/branch-3.9/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-3.9/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-3.9/search.html b/branch-3.9/search.html new file mode 100644 index 000000000..214eaff04 --- /dev/null +++ b/branch-3.9/search.html @@ -0,0 +1,632 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + + + +
                  + + + + + +
                  + + +
                  + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/searchindex.js b/branch-3.9/searchindex.js new file mode 100644 index 000000000..b00e75b19 --- /dev/null +++ b/branch-3.9/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "9": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "scylla": [0, 2, 4, 7, 10, 13, 24, 25, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37], "monitor": [0, 2, 4, 7, 10, 13, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37], "stack": [0, 2, 4, 7, 10, 13, 21, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 18, 20, 22, 24, 25, 26, 27, 30, 31, 32, 34, 36, 37], "full": [0, 1, 3, 6, 9, 10, 24], "alert": [0, 1, 3, 5, 6, 9, 12], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 15, 18, 20, 22, 32, 34, 36], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 13, 20, 27, 36, 37], "open": [0, 1, 3, 5, 6, 9, 15, 16, 19], "sourc": [0, 1, 3, 5, 6, 9, 10, 15, 19, 20, 36], "tool": [0, 1, 3, 9, 18, 37], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 13, 15, 18, 21, 22, 23, 37], "grafana": [0, 1, 3, 8, 9, 10, 21, 23], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 12, 15, 18, 21, 22, 23, 31, 37, 38], "consist": [1, 9, 10, 20, 31], "three": [1, 6, 10], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 18, 20], "collect": [1, 5, 6, 7, 8, 9, 22, 32, 34], "store": [1, 5, 8, 9, 13, 21, 23, 25, 26, 36], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 13, 15, 20, 21, 22, 23, 37], "alertmanag": [1, 2, 7, 9, 21, 23], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 16, 20, 24, 37], "choos": [1, 3, 9, 11, 12, 14, 17, 18, 38], "topic": [1, 3, 9, 11, 12, 14, 17, 26, 38], "get": [1, 6, 8, 9, 10, 13, 25, 31, 35, 36, 37], "start": [1, 3, 5, 8, 9, 10, 13, 20, 21, 22, 23], "user": [1, 2, 5, 6, 7, 9, 24, 37], "guid": [1, 6, 9, 12, 18, 19], "download": [1, 5, 6, 9, 20, 21, 22, 23], "instal": [1, 2, 9, 18], "procedur": [1, 5, 6, 9, 18, 19], "troubleshoot": [1, 9, 30], "refer": [1, 6, 9, 12], "upgrad": [1, 12], "lesson": [1, 9, 26, 27], "univers": [1, 9], "github": [1, 5, 6, 21, 23], "project": 1, "For": [1, 2, 4, 5, 6, 7, 9, 10, 13, 16, 18, 20, 31, 32, 35, 37], "older": [1, 9, 22, 23], "version": [1, 2, 5, 7, 9, 13, 15, 18], "document": [1, 5, 6, 8, 9, 10, 13, 18, 20, 21, 22, 23], "see": [1, 2, 4, 5, 6, 9, 10, 13, 16, 18, 20, 21, 22, 23, 37], "here": [1, 5, 6, 7, 9, 10, 13, 20], "base": [2, 5, 6, 7, 8, 9, 10, 13, 24, 37], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 20, 21, 22, 23, 27, 29, 31, 37, 38], "can": [2, 5, 6, 7, 8, 10, 13, 16, 18, 20, 21, 22, 23, 24, 27, 31, 37, 38], "all": [2, 3, 5, 6, 8, 10, 13, 16, 18, 20, 22, 24, 28, 31, 37], "sh": [2, 3, 6, 18, 20, 21, 22, 23], "kill": [2, 6, 18, 20, 22], "script": [2, 3, 6, 7, 13, 22], "an": [2, 4, 5, 7, 8, 9, 13, 18, 20, 22, 29, 30, 31, 32, 34, 36, 37], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 13, 16, 20], "requir": [2, 8, 25, 28, 32, 37], "more": [2, 4, 5, 6, 10, 13, 16, 18, 24, 27, 30, 32, 35, 37], "manual": [2, 18], "step": [2, 5, 8, 13, 18, 20, 21, 22, 23], "onc": [2, 20, 29, 36, 37], "configur": [2, 5, 7, 10, 13, 16, 18, 20, 31], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 20, 21, 22, 23, 31, 32, 33, 36, 37, 38], "two": [2, 6, 7, 8, 16, 20, 23, 31, 36, 37], "wai": [2, 5, 7, 10, 18, 30, 37], "launch": 2, "should": [2, 4, 5, 6, 8, 13, 18, 20, 22, 23, 24, 25, 28, 29, 30, 35, 37], "one": [2, 6, 7, 16, 20, 21, 22, 23, 25, 27, 28, 31, 32, 37], "both": [2, 5, 6, 18, 21, 23, 37], "In": [2, 6, 10, 13, 18, 20, 37], "particular": 2, "creat": [2, 5, 6, 7, 10, 13, 18, 24, 36, 37], "updat": [2, 5, 13, 18, 20], "yml": [2, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 37], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 13, 18, 20, 21, 23, 26, 31, 32, 37], "make": [2, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 31, 37], "sure": [2, 5, 6, 8, 10, 13, 18, 20, 21, 22, 23, 37], "have": [2, 4, 5, 6, 7, 8, 10, 13, 18, 23], "among": [2, 31], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 16, 18, 20, 21, 23], "address": [2, 5, 6, 7, 8, 16, 18, 20], "either": [2, 6], "locat": [2, 7, 10, 20, 22, 31], "scylla_serv": [2, 5, 6, 18, 20, 21, 22, 23, 37], "consul": [2, 7], "manag": [2, 5, 12, 15, 17], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 37], "exampl": [2, 4, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 31, 32, 37], "product": [2, 7], "system": [2, 7, 9, 10, 11, 21, 23, 25, 31, 37], "advis": [2, 31], "extern": [2, 5, 7, 8, 10, 13, 18, 21, 23, 37], "directori": [2, 5, 7, 8, 10, 13, 20, 21, 22, 23], "databas": [2, 5, 7, 20, 27, 37], "accordingli": 2, "below": [2, 6, 10, 16], "read": [2, 6, 8, 9, 10, 18, 20, 24, 28], "its": [2, 6, 7, 8, 9, 13, 20], "from": [2, 5, 7, 8, 9, 10, 18, 20, 21, 22, 23, 24, 30, 33, 37], "note": [2, 5, 6, 7, 18, 20, 21, 23], "latter": 2, "tell": 2, "where": [2, 5, 6, 13, 18, 20, 37], "themselv": [2, 13], "which": [2, 8, 12, 13, 14, 15, 30, 32, 34, 36, 37], "differ": [2, 5, 6, 7, 8, 13, 20, 21, 22, 23, 29, 30, 37], "run": [2, 3, 5, 6, 7, 8, 9, 13, 15, 18, 20, 22], "follow": [2, 4, 5, 6, 7, 13, 15, 18, 20, 21, 23, 37], "command": [2, 6, 8, 18, 20, 21, 23], "datasourc": [2, 5, 6, 8, 13], "under": [2, 5, 6], "yaml": [2, 5, 6, 16], "To": [2, 4, 5, 6, 13, 16, 20, 21, 22, 23], "sashboard": 2, "t": [2, 13], "line": [2, 6, 7, 8, 13, 20], "flag": [2, 6, 7, 8, 13, 18, 20, 21, 23], "v": [2, 6, 7, 8, 13, 18], "specifi": [2, 6, 7, 10, 13, 18, 20], "enterpris": [2, 6, 13, 15], "2020": [2, 6, 13, 15], "1": [2, 5, 6, 7, 8, 13, 15, 19, 21, 23], "thi": [2, 4, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 24, 25, 28, 31, 33, 37], "your": [2, 5, 6, 7, 8, 10, 11, 13, 16, 18, 20, 21, 23, 25, 26, 27, 37], "pass": [2, 6, 7, 20], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 9, 18], "container_nam": 2, "aalert": 2, "imag": [2, 9, 18], "prom": [2, 8, 18], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 10, 13, 15, 16, 20, 21, 22, 23], "port": [2, 5, 6, 7, 16, 18, 20, 21, 23], "9093": [2, 5], "volum": [2, 4, 5, 6, 21, 23], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 13], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 13, 22], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 21, 23, 26, 27, 28, 30, 32, 34, 35], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 13], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 13, 15], "5": [2, 5, 6, 13, 15, 18], "3000": [2, 5, 6, 21, 23], "1000": 2, "build": [2, 5], "plugin": [2, 5], "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 26, 32, 34, 37], "path": [2, 5, 6, 7, 8, 10, 20, 21, 22, 23], "dir": [2, 7, 8, 21, 23], "loki": [2, 6, 9], "mnt": 2, "3100": [2, 5], "rule": [2, 5, 7, 10, 29], "conf": [2, 5, 6], "promotheu": 2, "aprom": [2, 18], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 18], "d": [2, 5, 6, 7, 8, 20, 21, 22, 23], "scylla_manager_serv": [2, 5, 6, 18, 20, 22, 23], "node_exporter_serv": [2, 5, 6, 20, 21], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 18, 20, 37], "down": [2, 10, 18, 20, 21, 23, 25, 32], "begin": [3, 11, 12, 14, 17, 38], "deploi": [3, 6], "without": [3, 6, 7, 13, 20], "us": [3, 4, 5, 7, 9, 10, 11, 18, 20, 21, 22, 23, 27, 31, 32, 34, 36, 37], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6], "least": [4, 5, 6], "physic": [4, 5, 6], "core": [4, 5, 6], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 21, 23, 32, 36], "storag": [4, 5, 6, 7, 9, 13], "retent": [4, 5, 6, 20], "period": [4, 5, 6, 8, 10, 20, 36], "section": [4, 5, 6, 18, 20, 23, 37], "network": [4, 5, 6, 7, 18], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 18], "perform": [4, 5, 6, 31, 35, 37], "block": [4, 5, 6], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 27, 32, 34, 37], "default": [4, 5, 6, 7, 10, 13, 16, 18, 20, 22, 28, 37], "15": [4, 5, 6, 20], "dai": [4, 5, 6, 7, 20], "around": [4, 5, 6, 18], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 37], "assum": [4, 5, 6, 7, 8, 10, 21, 23], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 35], "6": [4, 5, 6, 13, 15], "node": [4, 5, 7, 15, 18, 20, 25, 26, 27, 31, 32, 34, 35, 37], "cluster": [4, 5, 6, 30, 37], "each": [4, 5, 7, 8, 9, 10, 13, 15, 18, 25, 27, 31, 36, 37], "16": [4, 5, 6, 18], "so": [4, 5, 6, 7, 8, 10, 13, 18, 20, 27, 37], "total": [4, 5, 6, 8, 13], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 20, 22, 29, 36, 37], "need": [4, 5, 6, 7, 8, 13, 18, 25, 26, 27, 37], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 13, 18, 33, 37], "replac": [4, 5, 6, 8, 13, 21, 23], "ad": [4, 5, 6, 7, 12], "we": [4, 5, 6, 8, 9, 13, 21, 23, 37], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 13, 18, 20, 25, 37], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 13, 18, 36, 37], "fast": [4, 5, 6], "enough": [4, 5, 6], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 13, 18, 20, 25, 31, 37], "out": [4, 5, 6, 8], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 31, 32, 34], "over": [4, 5, 6], "longer": [4, 5, 6, 13, 20, 22], "durat": [4, 5, 6, 10], "e": [4, 5, 6, 13], "g": [4, 5, 6, 7, 20, 21, 23], "look": [4, 5, 6, 8, 10, 13, 37], "week": [4, 5, 6, 7], "view": [4, 5], "would": [4, 5, 6, 8, 10, 13, 20, 24, 27, 37], "take": [4, 5, 6, 7, 13, 18, 20], "than": [4, 5, 6, 10, 13, 20, 37], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 13, 31], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 18, 22, 32], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 13, 16, 20, 37], "swap": [4, 5, 6], "crash": [4, 5, 6], "instruct": [5, 6, 21, 23], "help": [5, 7, 10, 13, 37], "pleas": [5, 18], "most": [5, 10, 13, 31, 33, 37], "current": [5, 6, 7, 10, 13, 18, 21, 23], "common": [5, 7, 37], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 18], "standalon": 5, "thei": [5, 7, 10, 35, 36], "alreadi": [5, 21, 23], "consolid": 5, "componen": 5, "suggest": [5, 13], "those": 5, "offici": 5, "also": [5, 6, 7, 8, 10, 13], "main": [5, 20, 36], "item": 5, "set": [5, 6, 7, 10, 13, 16], "avail": [5, 6, 8, 10, 12, 13, 14, 25, 26, 37], "data": [5, 7, 9, 10, 13, 20, 21, 22, 23, 24, 25, 26, 27, 31, 32, 34, 35, 37], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 18], "befor": [5, 6, 10, 20, 21, 22, 23, 25, 26, 32, 37], "support": [5, 6, 13, 14, 24, 30, 37], "want": [5, 6, 10, 21, 23], "latest": [5, 6, 7, 21, 23], "releas": [5, 20, 21, 22, 23], "tightli": 5, "compat": [5, 13, 18, 20, 22], "matrix": [5, 14], "cento": [5, 18], "instanc": [5, 6, 10, 13], "wget": [5, 6, 21, 23], "http": [5, 6, 8, 18, 20, 21, 23, 26, 27, 28, 30, 35], "com": [5, 6, 21, 23, 26, 27, 28, 30, 35], "archiv": [5, 6, 21, 23], "ref": 5, "tag": 5, "tar": [5, 6, 21, 23], "gz": [5, 6], "xvf": [5, 6], "test": [5, 18, 21, 37], "22": [5, 13], "linux": 5, "amd64": 5, "copi": [5, 20, 21, 22, 23], "file": [5, 7, 8, 10, 13, 16, 20, 22], "cp": [5, 21, 22, 23], "p": [5, 7, 8, 18, 20, 21, 23], "home": 5, "cd": [5, 6, 21, 23], "verifi": [5, 22], "point": [5, 6, 13, 21, 23], "browser": [5, 6, 8, 13, 18, 21, 23], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 18], "aggreg": 5, "inspir": 5, "central": [5, 9], "check": [5, 10, 18, 21, 23, 33, 34, 37], "recomand": 5, "local": [5, 6, 7, 8, 9, 13, 18, 21, 23, 37], "describ": [5, 6, 8, 16, 18, 37], "respons": [5, 10], "pars": [5, 9, 13, 29, 37], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 32, 34], "load": [5, 6, 18, 24, 27, 28, 37], "multipl": [5, 6, 7, 8, 9, 10, 13, 25, 28, 29, 35, 37], "do": [5, 6, 7, 13, 18, 20, 21, 22, 23, 27, 37], "rsyslog": [5, 9], "second": [5, 6, 10, 18, 20, 21, 23], "relat": [5, 37], "modifi": [5, 12], "mkdir": 5, "templat": [5, 6, 8, 18, 20, 37], "edit": [5, 6, 7, 8, 13, 18], "localhost": [5, 7], "loki_ip": 5, "": [5, 6, 7, 9, 10, 13, 24, 25, 33, 36, 37], "27": [5, 6, 13], "If": [5, 6, 7, 8, 13, 18, 20, 22, 33, 35, 36, 37], "besid": [5, 7, 20, 37], "expect": [5, 10, 21, 23], "scrap": 5, "job": [5, 6, 18], "onli": [5, 6, 7, 20, 22, 27, 29, 36, 37], "import": [5, 6, 7, 20, 21, 23], "record": 5, "asspect": 5, "work": [5, 6, 7, 8, 10, 13, 20, 21, 23], "code": [5, 31], "shell": 5, "prom_rul": 5, "correct": [5, 22], "static": 5, "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 20, 30], "host": [5, 6, 7, 9, 18], "static_config": [5, 6], "target": [5, 7, 13, 16, 18, 20, 22], "127": [5, 7, 18], "right": [5, 6, 13, 31, 37], "typic": [5, 13, 25, 27, 36, 37], "node_export": [5, 6, 7, 9, 15, 18], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 13, 16, 20, 22, 28, 37], "everi": [5, 6, 7], "scrape_timeout": 5, "4": [5, 6, 13, 15], "timeout": 5, "try": [5, 18], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10], "ani": [5, 6, 10, 13, 18, 31, 37], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 20], "scrape_config": [5, 20], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 16, 18], "There": [5, 6, 8, 10, 12, 13, 14, 35, 38], "instead": [5, 6, 8, 37], "found": [5, 6, 7, 10, 13], "must": [5, 6, 32], "even": [5, 6, 7], "center": [5, 6, 8, 37], "cat": 5, "list": [5, 6], "end": [5, 6, 20, 37], "66": [5, 18], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8], "dc1": [5, 6], "172": [5, 6, 18], "17": [5, 6, 15, 18, 22], "dc2": [5, 6], "previou": [5, 23], "deprec": 5, "5090": [5, 6, 18], "tsdb": [5, 7, 8], "accumul": 5, "consol": [5, 18], "visibl": 5, "execut": [5, 24, 29], "through": 5, "node_memory_memfre": 5, "And": [5, 21, 23], "scylla_reactor_util": 5, "At": [5, 13, 23], "emit": 5, "abl": [5, 8, 20, 22], "them": [5, 7, 9, 10, 13, 22, 31], "grafna": 5, "depend": [5, 8], "repositori": [5, 6], "yum": 5, "zip": [5, 21, 23], "structur": 5, "rest": [5, 8], "access": [5, 7], "sudo": [5, 6, 18], "r": [5, 7, 13, 18], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 13, 18], "provis": [5, 6, 13], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 13, 25, 26, 32, 36, 37], "folder": 5, "name": [5, 6, 8, 10, 18, 22, 37], "otherwis": 5, "apivers": 5, "type": [5, 13, 37], "url": [5, 8, 20], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "setup": 6, "dedic": 6, "pull": [6, 18], "evalu": 6, "laptop": 6, "tabl": [6, 10, 15, 24, 31, 37], "29": 6, "8": [6, 15, 20], "25": [6, 18], "avoid": [6, 13, 18, 28, 30, 37], "root": [6, 18, 21, 23], "go": [6, 18], "group": [6, 10], "groupadd": 6, "new": [6, 18, 36], "activ": [6, 10], "next": [6, 7, 8, 21, 23], "login": [6, 18], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 18, 20], "extract": 6, "binari": [6, 18], "As": [6, 13, 29], "clone": 6, "git": 6, "directli": [6, 9], "checkout": 6, "branch": 6, "restart": [6, 7, 8, 20], "know": [6, 18, 27, 37], "done": [6, 7, 13, 18], "higher": [6, 27, 37], "wish": [6, 7], "match": [6, 37], "datacent": 6, "nodetool": 6, "statu": [6, 18], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 20], "listen": [6, 7, 16, 20], "inform": [6, 7, 12, 13, 14, 16, 24, 25, 26], "agent": [6, 7, 8, 9, 15, 18], "machin": [6, 7, 18, 22], "overrid": [6, 7, 13], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 13], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 18, 21, 23], "10": [6, 10, 13], "within": [6, 10], "cql": [6, 9, 31, 38], "protect": 6, "author": [6, 7], "assign": 6, "limit": [6, 8, 10, 28, 37], "keyspac": 6, "securejsondata": 6, "part": [6, 10, 22, 24, 27, 31, 37], "place": [6, 7, 8, 13, 37], "outsid": [6, 7, 20], "result": [6, 7, 20, 25, 27, 28, 36, 37], "lost": [6, 7, 13, 37], "exist": [6, 13, 37], "permiss": [6, 20], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 37], "firewal": [6, 18], "7000": [6, 18], "myservic": 6, "m": [6, 7, 20, 21, 23], "2019": [6, 15, 35], "reach": [6, 8, 27, 32, 37], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 27, 28, 32, 34, 37], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 13, 18], "authent": [6, 7], "disabl": [6, 16], "option": [6, 8, 9, 18, 20], "simplest": 7, "small": [7, 36], "util": [7, 13, 22], "appropri": 7, "h": [7, 13], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 32], "map": 7, "bind": [7, 16], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 20, 26, 29, 31], "addit": [7, 9, 10, 12, 14, 37], "auto": 7, "automat": 7, "failur": [7, 18], "gui": [7, 13, 18], "keep": [7, 20], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "specif": [7, 10, 16, 18, 33, 37], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "role": 7, "privileg": 7, "That": [7, 10, 13], "mean": [7, 13, 20, 24, 25, 26, 27, 28, 32, 34, 37], "chang": [7, 13, 16, 18, 20, 21, 22, 23], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 13], "b": 7, "o": [7, 15, 22, 31], "disk": [7, 10, 13, 18, 24, 26, 31], "relev": [7, 31], "possibl": [7, 10, 16, 30, 37], "api": [7, 8, 16, 20], "resolv": 7, "explicitli": [7, 13], "request": [7, 16, 31], "how": [7, 8, 10, 13, 21, 23, 25, 26, 27, 31, 37], "someth": [7, 10, 11, 13, 36], "opportun": 7, "demonstr": 7, "cover": [7, 20], "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "additiuon": 8, "high": [8, 13, 26], "horizont": 8, "scale": 8, "backup": 8, "benefit": [8, 37], "flexibl": 8, "design": 8, "some": [8, 10, 31, 35], "front": 8, "few": [8, 9, 21, 23], "reason": [8, 13, 18, 34, 37], "why": [8, 13], "million": 8, "singl": [8, 13, 31], "capac": 8, "sometim": 8, "traffic": [8, 18, 35, 37], "between": [8, 18, 20, 21, 23, 31, 37], "reachabl": [8, 20], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 13, 20, 21, 23, 26], "expos": [8, 16, 20], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 31], "10903": 8, "10904": 8, "replica": [8, 25, 26, 27, 31, 32, 37], "connect": [8, 13, 16, 18], "abov": [8, 21, 23], "last": 8, "db_address": 8, "could": [8, 31, 35, 37], "long": [8, 10, 36], "now": [8, 10], "grafan": 9, "render": [9, 13], "sidecar": 9, "receiv": [9, 10, 37], "distribut": [9, 27, 35, 37], "email": [9, 10], "slack": [9, 10], "displai": [9, 22], "enhanc": [10, 11], "notifi": [10, 11, 31], "wrong": [10, 11, 13, 18, 36, 37], "shown": [10, 18, 21, 23], "overview": [10, 26, 31], "condit": 10, "met": 10, "certain": 10, "defin": [10, 13, 20, 30, 37], "what": 10, "happen": [10, 18], "report": [10, 15, 18, 37], "let": [10, 20], "u": 10, "instancedown": 10, "expr": [10, 13], "60": 10, "sever": [10, 12, 14, 38], "annot": 10, "descript": [10, 31], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 13, 21], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 37], "rout": [10, 27, 37], "repres": 10, "tree": 10, "win": [10, 18], "inhibit": 10, "mute": 10, "via": [10, 18], "sluck": 10, "detail": [10, 31], "wors": 10, "correctli": [10, 13, 20, 22], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 22], "reduc": [10, 13, 25], "simul": 10, "actual": [10, 34], "low": [10, 37], "space": 10, "lower": [10, 37], "fire": 10, "show": [10, 13, 15, 37], "propag": 10, "valu": [10, 13, 29, 36, 37], "similar": [10, 13], "free": 10, "big": [10, 37], "bisect": 10, "problem": [10, 31, 37], "give": [12, 14], "explain": [13, 21, 23, 31], "intern": [13, 27, 37], "issu": [13, 31, 35, 37], "whenev": 13, "gone": 13, "save": 13, "mention": 13, "earlier": 13, "overridden": 13, "perman": 13, "eventu": 13, "made": 13, "larg": [13, 31], "maintain": 13, "json": 13, "too": [13, 36], "verbos": 13, "element": [13, 31], "object": 13, "attribut": 13, "graph": [13, 20, 22, 37], "aliascolor": 13, "bar": 13, "error": [13, 31, 32, 34], "fill": 13, "grid": 13, "threshold1": 13, "null": 13, "threshold1color": 13, "rgba": 13, "216": 13, "200": 13, "threshold2": 13, "threshold2color": 13, "234": 13, "112": 13, "gridpo": 13, "w": [13, 18], "x": [13, 18, 19], "y": [13, 19], "id": [13, 18], "isnew": 13, "legend": 13, "avg": 13, "max": 13, "min": 13, "linewidth": 13, "link": [13, 31], "nullpointmod": 13, "percentag": [13, 37], "pointradiu": 13, "flot": 13, "seriesoverrid": 13, "span": 13, "steppedlin": 13, "sum": 13, "node_filesystem_avail": 13, "intervalfactor": 13, "legendformat": 13, "refid": 13, "timefrom": 13, "timeshift": 13, "titl": 13, "size": [13, 28, 37], "tooltip": 13, "msresolut": 13, "share": 13, "sort": [13, 30, 37], "value_typ": 13, "cumul": 13, "transpar": 13, "xaxi": 13, "yax": 13, "percent": 13, "logbas": 13, "101": 13, "short": 13, "imagin": 13, "redund": 13, "resembl": 13, "css": 13, "hierarch": 13, "definit": [13, 20, 37], "inherit": 13, "row": [13, 30, 37], "base_row": 13, "collaps": 13, "height": 13, "250px": 13, "150px": 13, "output": 13, "bytes_panel": 13, "byte": 13, "unit": 13, "axi": 13, "adjust": 13, "readabl": 13, "gb": 13, "mb": 13, "grasp": 13, "origin": [13, 33], "12": [13, 18], "wa": [13, 37], "larger": 13, "break": [13, 28, 37], "later": 13, "absolut": 13, "posit": 13, "ie": 13, "width": 13, "backward": [13, 18, 20, 22], "ve": 13, "had": 13, "imposs": 13, "hand": 13, "overcom": 13, "transit": [13, 22], "calcul": 13, "taken": [13, 20], "still": 13, "unlik": 13, "partial": 13, "24": 13, "don": 13, "python": 13, "make_dashboard": 13, "revers": [13, 31], "usual": [13, 18, 31, 37], "easier": 13, "wrapper": 13, "re": [13, 27], "just": 13, "refresh": 13, "generate_gener": 13, "mayb": 13, "interfac": [14, 18], "2021": 15, "2018": [15, 28], "14": [15, 18], "onlin": 16, "prometheus_port": 16, "restrict": 16, "prometheus_address": 16, "integr": 17, "56090": 18, "old": [18, 21, 22, 23], "howev": 18, "twice": 18, "easiest": 18, "remov": [18, 20], "scylla_manager1": 18, "messag": 18, "wait": [18, 32], "non": [18, 20, 26, 27, 31, 35, 37], "post": 18, "proper": 18, "past": [18, 22], "mai": [18, 31, 32, 37], "ownership": 18, "la": 18, "grep": 18, "drwxr": 18, "xr": 18, "4096": 18, "jun": 18, "51": 18, "chown": 18, "appear": 18, "unreach": [18, 32], "immedi": 18, "suspect": 18, "tab": 18, "rang": [18, 37], "align": 18, "On": [18, 31], "41bd3db26240": 18, "entrypoin": 18, "ago": 18, "23": 18, "7001": 18, "tcp": 18, "9042": 18, "9160": 18, "10000": 18, "click": 18, "usag": [18, 27, 37], "fetch": 18, "curl": 18, "scylla_nod": 18, "return": [18, 20, 24, 25, 26, 28, 32, 34, 37], "ef": 18, "gre": 18, "scylla_setup": 18, "9100": 18, "while": [18, 20, 21, 23], "captur": 18, "tshark": 18, "f": 18, "dst": 18, "eth0": 18, "toward": 18, "199": 18, "203": 18, "229": 18, "89": 18, "142": 18, "59212": 18, "ack": 18, "seq": 18, "317": 18, "78193": 18, "158080": 18, "len": 18, "tsval": 18, "79869679": 18, "tsecr": 18, "3347447210": 18, "74": 18, "60440": 18, "syn": 18, "29200": 18, "mss": 18, "1460": 18, "sack_perm": 18, "79988291": 18, "128": 18, "sinc": 20, "parallel": [20, 21, 23], "migrat": [20, 21, 23], "lose": 20, "histor": 20, "process": 20, "safe": 20, "page": [20, 22, 31], "unzip": [20, 21, 22, 23], "3001": [20, 21, 23], "9091": [20, 21, 23], "9094": 20, "fail": [20, 25, 27, 31, 37], "loss": 20, "everyth": 20, "stop": [20, 21, 22, 23], "format": 20, "were": [20, 37], "rule_fil": 20, "montior": 20, "9111": 20, "phase": [20, 22], "serv": 20, "remote_read": 20, "v1": 20, "histori": [20, 22], "continu": [20, 21, 23], "back": [20, 25], "recommend": [21, 23], "uninstal": [21, 23], "minor": [21, 23], "first": [21, 23, 37], "9095": [21, 23], "brows": [21, 23], "satisfi": [21, 23], "shut": [21, 23], "caus": [21, 23, 27, 37], "blackout": [21, 23], "normal": [21, 23], "dure": [21, 23], "oper": [21, 23, 31, 37], "complet": [21, 23], "switch": 22, "fulli": 22, "affect": 22, "helper": 22, "node_exporter_instal": 22, "ship": 22, "sub": 22, "color": 22, "simpli": 22, "side": [23, 24, 31, 37], "newer": 23, "previous": 23, "primari": [24, 37], "kei": [24, 30, 37], "scan": 24, "These": [24, 37], "kind": [24, 37], "bigger": 24, "care": [24, 25, 26, 37], "replicationfactor": [25, 26], "piec": 25, "determin": [25, 26, 32, 37], "mani": [25, 26, 37], "repli": [25, 26, 28, 32, 34, 37], "unavail": [25, 37], "client": [25, 28, 31, 37], "respond": 25, "accompani": 25, "deep": 25, "understand": 25, "fall": 25, "mechan": 25, "write": 26, "acknowledg": 26, "coordin": [26, 27, 32, 34, 37], "hint": 26, "fact": 26, "yet": 26, "cours": [26, 27], "essenti": 26, "text": [26, 37], "20of": 26, "20the": 26, "20most": 26, "20common": 26, "20with": 26, "20lowest": 26, "20consist": 26, "ideal": [27, 37], "latenc": [27, 31, 37], "resourc": [27, 30, 37], "driver": [27, 28, 35, 37], "replic": [27, 32, 34, 37], "prepar": [27, 31, 35], "statement": [27, 29, 31, 35], "balanc": [27, 31, 37], "polici": 27, "intro": 27, "recap": 27, "ring": [27, 37], "architectur": 27, "chunk": [28, 37], "increas": [28, 37], "overal": [28, 37], "thu": 28, "www": [28, 35], "07": 28, "13": 28, "effici": [28, 37], "optim": [29, 35, 38], "concret": 29, "thumb": 29, "alwai": 29, "favor": 29, "partit": [30, 31], "BY": [30, 37], "ineffici": [30, 37], "consum": 30, "doc": 30, "recogn": 31, "bad": 31, "practic": [31, 35], "potenti": [31, 37], "solv": 31, "left": 31, "categori": [31, 37], "jump": 31, "warn": 31, "cell": 31, "indic": [31, 36, 37], "model": [31, 35, 37], "impact": 31, "imbal": 31, "shard": 31, "imbalanc": 31, "hot": 31, "bottleneck": [31, 35], "cach": 31, "hit": 31, "filter": 31, "token": 31, "awar": 31, "select": [31, 37], "order": [31, 37], "due": 31, "unsatisfi": 31, "faulti": 31, "evict": 31, "answer": [32, 34], "aka": 32, "factor": 32, "quorum": [32, 37], "hardwar": 33, "occur": 33, "leav": 34, "risk": 34, "identifi": [34, 37], "evenli": 35, "across": 35, "becom": 35, "explan": 35, "08": 35, "best": 35, "field": 36, "being": 36, "defi": 36, "purpos": 36, "might": 36, "upper": 37, "gaug": 37, "inspect": 37, "zero": 37, "mislead": 37, "panel": 37, "holder": 37, "safer": 37, "prevent": 37, "inject": 37, "rate": 37, "did": 37, "compound": 37, "column": 37, "ks1": 37, "table_demo": 37, "int": 37, "WITH": 37, "desc": 37, "cat1": 37, "asc": 37, "overhead": 37, "thing": 37, "much": 37, "drop": 37, "major": 37, "success": 37, "hurt": 37, "cl": 37, "expens": 37, "term": 37, "cost": 37, "ONE": 37, "local_quorum": 37, "local_on": 37, "reli": 37, "nearest": 37, "advisor": 38}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 26, 31, 38], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 31, 38], "stack": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 31, 38], "us": [2, 6, 8, 13, 24, 25, 26, 30, 38], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 13], "set": [2, 20, 21, 23], "prometheu": [2, 4, 5, 6, 7, 8, 10, 16, 20], "grafana": [2, 5, 6, 7, 13, 18], "provis": 2, "data": [2, 6, 8, 18], "sourc": [2, 8, 18], "file": [2, 6, 18, 21, 23], "dashboard": [2, 6, 13], "load": 2, "start": [2, 6, 7, 18], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 20, 21, 22, 23], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 13, 20], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 33], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "compat": 6, "matrix": [6, 15], "post": [6, 28, 35], "configur": [6, 8], "node": [6, 33], "from": [6, 13], "manag": [6, 7, 11, 18], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 18], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": [6, 20, 21, 22, 23], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 13, 21, 23, 31, 37], "all": [7, 21, 23, 25], "sh": [7, 13], "command": 7, "gener": [7, 13], "option": 7, "relat": [7, 20, 21, 22, 23], "ldap": 7, "support": [7, 15], "retent": 7, "period": 7, "alert": [7, 10, 11, 20], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 24, 25, 26, 27, 28, 29, 30, 35, 37], "updat": 8, "high": 9, "level": [9, 18, 25, 26, 32, 37], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 13], "procedur": [12, 20, 21, 22, 23], "modifi": 13, "limit": 13, "consist": [13, 25, 26, 32, 37], "between": 13, "restart": 13, "upgrad": [13, 18, 19, 20, 21, 22, 23], "templat": 13, "class": 13, "panel": 13, "exampl": 13, "format": 13, "layout": 13, "valid": [13, 20, 21, 22, 23], "refer": 14, "guid": [14, 17, 20, 21, 22, 23], "interfac": 16, "troubleshoot": [17, 18], "problem": 18, "2": [18, 20, 21, 22], "duplic": 18, "inform": 18, "A": 18, "contain": [18, 21, 23], "fail": [18, 32, 34], "To": 18, "And": 18, "permiss": 18, "No": 18, "point": 18, "solut": 18, "chart": 18, "show": 18, "error": [18, 33], "sign": 18, "server": [18, 21, 23], "metric": 18, "notic": 18, "user": 18, "open": 18, "3": [18, 20, 22, 23], "0": 18, "enterpris": 18, "2019": 18, "1": [18, 20, 22], "work": 18, "wireshark": 18, "x": [20, 21, 22, 23], "latest": 20, "new": [20, 21, 22, 23], "rule": 20, "4": 20, "move": [20, 21, 23], "old": 20, "b": 20, "rollback": [20, 21, 22, 23], "link": [20, 21, 22, 23, 26, 27, 28, 30, 35], "y": [21, 23], "": [21, 23], "i": [21, 23, 33], "run": [21, 23], "correct": [21, 23], "correctli": [21, 23], "kill": [21, 23], "node_export": 22, "test": 23, "mode": 23, "some": [24, 25, 26, 27, 28, 29, 30, 32, 34], "allow": [24, 37], "filter": [24, 37], "ani": 26, "univers": [26, 27], "ar": [27, 28, 29, 35], "token": [27, 37], "awar": [27, 37], "select": 28, "non": [28, 29], "page": [28, 37], "blog": [28, 35], "prepar": [29, 36, 37], "revers": [30, 37], "order": 30, "document": 30, "advisor": 31, "section": 31, "oper": [32, 34], "due": 32, "unsatisfi": 32, "o": 33, "can": 33, "indic": 33, "faulti": 33, "replica": 34, "side": 34, "cql": [35, 37], "balanc": 35, "among": 35, "shard": 35, "statement": [36, 37], "cach": 36, "evict": 36, "optim": 37, "read": 37, "cross": 37, "dc": 37, "request": 37}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"I/O Errors can indicate a node with a faulty disk": [[33, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Scylla Monitoring Stack Advisor": [[31, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[31, "the-advisor-section"]], "Some operation failed due to unsatisfied consistency level": [[32, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Some queries use reverse order": [[30, "some-queries-use-reverse-order"]], "Documentation link": [[30, "documentation-link"]], "Some operations failed on the replica side": [[34, "some-operations-failed-on-the-replica-side"]], "Some SELECT queries are non-paged": [[28, "some-select-queries-are-non-paged"]], "Blog-post Links": [[28, "blog-post-links"]], "Some queries are non-prepared": [[29, "some-queries-are-non-prepared"]], "Some queries are not token-aware": [[27, "some-queries-are-not-token-aware"]], "University link": [[27, "university-link"]], "CQL queries are not balanced among shards": [[35, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[35, "blog-post-link"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Support Matrix": [[15, "scylla-monitoring-stack-support-matrix"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Stack Reference Guide": [[14, "scylla-monitoring-stack-reference-guide"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[17, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack": [[9, "scylla-monitoring-stack"], [1, "scylla-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Scylla Monitoring Stack Interfaces": [[16, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[16, "prometheus"]], "Adding and Modifying Dashboards": [[13, "adding-and-modifying-dashboards"]], "General Limitations": [[13, "general-limitations"]], "consistency between restarts": [[13, "consistency-between-restarts"]], "consistency between upgrades": [[13, "consistency-between-upgrades"]], "Using templated Dashboards": [[13, "using-templated-dashboards"]], "The template class system": [[13, "the-template-class-system"]], "Panel example": [[13, "panel-example"]], "Grafana Formats and Layouts": [[13, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[13, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[13, "prerequisite"], [2, "prerequisite"]], "Validation": [[13, "validation"], [20, "validation"]], "Scylla Monitoring Stack Procedures": [[12, "scylla-monitoring-stack-procedures"]], "Troubleshoot Scylla Monitoring Stack": [[18, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[18, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[18, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[18, "a-container-fails-to-start"]], "Files And Directory Permissions": [[18, "files-and-directory-permissions"]], "No Data Points": [[18, "no-data-points"]], "Solution": [[18, "solution"], [18, "id1"], [18, "id2"], [18, "id3"]], "Grafana Chart Shows Error (!) Sign": [[18, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[18, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[18, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[18, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[18, "working-with-wireshark"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[23, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Upgrade Procedure": [[23, "upgrade-procedure"], [20, "upgrade-procedure"], [21, "upgrade-procedure"], [22, "upgrade-procedure"]], "Install 3.y (The new version)": [[23, "install-3-y-the-new-version"]], "Setting the server\u2019s files": [[23, "setting-the-server-s-files"], [21, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[23, "validate-the-new-version-is-running-the-correct-version"], [21, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[23, "validate-the-version-installed-correctly"], [21, "validate-the-version-installed-correctly"]], "Killing the new 3.y Monitoring stack in testing mode": [[23, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[23, "move-to-version-3-y-the-new-version"]], "Kill all containers": [[23, "kill-all-containers"], [21, "kill-all-containers"]], "Rollback to version 3.x": [[23, "rollback-to-version-3-x"]], "Related Links": [[23, "related-links"], [20, "related-links"], [21, "related-links"], [22, "related-links"]], "Upgrade Scylla Monitoring Stack": [[19, "upgrade-scylla-monitoring-stack"]], "Some queries use ALLOW FILTERING": [[24, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[20, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[20, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[20, "install-the-new-monitoring-stack"], [22, "install-the-new-monitoring-stack"]], "3. Alerting Rules": [[20, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[20, "moving-to-prometheus-2-x"]], "a. Set the old system": [[20, "a-set-the-old-system"]], "b. Set the new system": [[20, "b-set-the-new-system"]], "Validate the upgrade": [[20, "validate-the-upgrade"], [22, "validate-the-upgrade"]], "Rollback": [[20, "rollback"], [22, "rollback"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[21, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[21, "install-2-y-the-new-version"]], "Move to version 2.y (the new version)": [[21, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[21, "rollback-to-version-2-x"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[22, "validate-node-exporter-version"]], "Some queries use Consistency Level: ALL": [[25, "some-queries-use-consistency-level-all"]], "Some queries use Consistency Level: ANY": [[26, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[26, "link-to-scylla-university"]], "Prepared statements cache eviction": [[36, "prepared-statements-cache-eviction"]], "Using Scylla Monitoring Stack": [[38, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[37, "the-cql-optimization"]], "Prepared Statements": [[37, "prepared-statements"]], "Token Aware": [[37, "token-aware"]], "Paged Queries": [[37, "paged-queries"]], "Reversed CQL Reads": [[37, "reversed-cql-reads"]], "ALLOW FILTERING": [[37, "allow-filtering"]], "Consistency Level": [[37, "consistency-level"]], "Cross DC": [[37, "cross-dc"]], "Cross DC Consistency Level": [[37, "cross-dc-consistency-level"]], "Cross DC read requests": [[37, "cross-dc-read-requests"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "The start-all.sh command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-3.9/sitemap.xml b/branch-3.9/sitemap.xml new file mode 100644 index 000000000..7974d4590 --- /dev/null +++ b/branch-3.9/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-3.9/troubleshooting/index.html b/branch-3.9/troubleshooting/index.html new file mode 100644 index 000000000..f640a3aea --- /dev/null +++ b/branch-3.9/troubleshooting/index.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Troubleshooting Guide for Scylla Monitoring Stack

                  +
                  +
                  +

                  Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/troubleshooting/monitor_troubleshoot.html b/branch-3.9/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..3b2535e61 --- /dev/null +++ b/branch-3.9/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,862 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Troubleshoot Scylla Monitoring Stack

                  +

                  This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                  +
                  +

                  Problem

                  + +
                  +

                  Scylla-Manager 2.2 with Duplicate information

                  +

                  Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                  +
                    +
                  • For Manager server: from 56090 to 5090

                  • +
                  • For Manager Agent: from 56090 to 5090

                  • +
                  +

                  For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                  +

                  However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                  +

                  The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                  +

                  Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                  +
                  +
                  +

                  A Container Fails To Start

                  +

                  When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                  +
                  Wait for Prometheus container to start........Error: Prometheus container failed to start
                  +
                  +
                  +

                  Should this happen, check the Docker logs for more information.

                  +
                  docker logs aprom
                  +
                  +
                  +

                  Usually the reason for the failure is described in the logs.

                  +
                  +
                  +

                  Files And Directory Permissions

                  +
                  +

                  Note

                  +

                  Avoid running Docker containers as root.

                  +
                  +

                  The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                  +

                  If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                  +
                  +

                  Note

                  +

                  If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                  +
                  +

                  For example if your Prometheus data directory is /prom-data and you are using centos user

                  +
                  ls -la /|grep prom-data
                  +
                  +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                  +
                  +sudo chown -R centos:centos /prom-data
                  +
                  +ls -la /|grep prom-data
                  +
                  +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                  +
                  +
                  +
                  +
                  +

                  No Data Points

                  +

                  No data points on all data charts.

                  +
                  +

                  Solution

                  +

                  If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                  +
                    +
                  1. Login to the Prometheus console:

                  2. +
                  3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                  4. +
                  5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                  6. +
                  +
                  +
                    +
                  • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                  • +
                  • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                  • +
                  • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                  • +
                  +
                  +

                  For example:

                  +
                  ./start-all.sh -v 3.1
                  +
                  +
                  +

                  More on start-all.sh options.

                  +
                  +
                  +
                  +

                  Grafana Chart Shows Error (!) Sign

                  +

                  Run this procedure on the Scylla Monitoring Stack server.

                  +

                  If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                  +
                  +

                  Solution

                  +

                  On the Scylla Monitoring Stack server:

                  +
                    +
                  1. Check Prometheus is running using docker ps.

                  2. +
                  +
                    +
                  • If it is not running check the prometheus.yml for errors.

                  • +
                  +

                  For example:

                  +
                  CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                  +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                  +
                  +
                  +
                    +
                  • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                  • +
                  +
                  +
                  +
                  +

                  Grafana Shows Server Level Metrics, but not Scylla Metrics

                  +

                  Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                  +
                  +

                  Solution

                  +
                    +
                  • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                  • +
                  +

                  For example

                  +
                  curl 172.17.0.2:9180/metrics
                  +
                  +
                  +
                  +
                  +
                  +

                  Grafana Shows Scylla Metrics, but not Server Level Metrics

                  +

                  Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                  +
                  +

                  Solution

                  +

                  1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                  +
                    +
                  1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                  2. +
                  +
                  +
                  +

                  Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                  +

                  While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                  +

                  If the node_exporter service is not starting it may need to be updated manually.

                  +

                  Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                  +
                  +
                  +
                  +

                  Working with Wireshark

                  +

                  No metrics shown in the Scylla Monitoring Stack.

                  +
                    +
                  1. Install wireshark

                  2. +
                  +

                  2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                  +

                  For example:

                  +
                  tshark -i eth0 -f "dst port 9180"
                  +
                  +
                  +

                  Capture from Scylla node towards Scylla Monitoring Stack server.

                  +

                  In this example, Scylla is running.

                  +
                  Monitor ip        Scylla node ip
                  +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                  +
                  +
                  +

                  In this example, Scylla is not running

                  +
                  Monitor ip        Scylla node ip
                  +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                  +
                  +
                  +
                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/index.html b/branch-3.9/upgrade/index.html new file mode 100644 index 000000000..4c62774c8 --- /dev/null +++ b/branch-3.9/upgrade/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Scylla Monitoring Stack

                  +
                  +
                  +
                  +
                  +
                  +
                  Upgrade Scylla Open Source
                  +
                  + +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-3.9/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..d1410d32f --- /dev/null +++ b/branch-3.9/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,801 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                  +

                  This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                  + +

                  Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                  +
                  +

                  Upgrade Procedure

                  +
                  +

                  1. Upgrade to the latest 1.x version

                  +

                  Before starting the upgrade procedure, make sure you are running the latest 1.x version

                  +
                  +
                  +

                  2. Install the new monitoring stack

                  +
                    +
                  1. Download the 2.x version from the release page.

                  2. +
                  3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                  4. +
                  5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                    +
                      +
                    • scylla_servers.yml

                    • +
                    • scylla_manager_servers.yml

                    • +
                    • node_exporter_servers.yml

                    • +
                    +
                  6. +
                  7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                  8. +
                  +
                  ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                  +
                  +
                  +
                  +

                  Note

                  +

                  Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                  +
                  +

                  While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                  +
                  ./kill-all.sh -g 3001 -p 9091 -m 9094
                  +
                  +
                  +
                  +

                  Validation

                  +

                  Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                  +
                  +
                  +
                  +

                  3. Alerting Rules

                  +

                  Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                  +
                  +
                  +

                  4. Moving to Prometheus 2.x

                  +

                  Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                  +

                  Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                  +
                  +

                  a. Set the old system

                  +

                  The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                  +
                    +
                  • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                  • +
                  • Restart the old montioring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                  • +
                  +
                  +

                  Note

                  +

                  After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                  +
                  +
                  +
                  +

                  b. Set the new system

                  +

                  The following step will allow the new monitoring system to read historical metrics from the old system.

                  +
                    +
                  • In the Prometheus prometheus.yml.template file add the following at the end:

                  • +
                  +
                  remote_read:
                  +  - url: "http://{ip}:9111/api/v1/read"
                  +
                  +
                  +

                  Where {ip} is the ip of the old system.

                  +
                    +
                  • restart the new stack

                  • +
                  +
                  +
                  +
                  +

                  Validate the upgrade

                  +

                  You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                  +
                  +
                  +
                  +

                  Rollback

                  +

                  In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                  +
                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..bb121d09a --- /dev/null +++ b/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,790 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                  +

                  This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                  + +
                  +

                  Upgrade Procedure

                  +

                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                  +

                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                  +
                  +

                  Install 2.y (The new version)

                  +
                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                  +unzip scylla-monitoring-2.y.zip
                  +cd scylla-monitoring-scylla-monitoring-2.y/
                  +
                  +
                  +

                  Replace “y” with the new minor release number, for example, 2.1.zip

                  +
                  +
                  +

                  Setting the server’s files

                  +

                  Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                  +
                  cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                  +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                  +
                  +
                  +
                  +
                  +

                  Validate the new version is running the correct version

                  +

                  Starting from Scylla-Monitoring version 2.2, you can run:

                  +
                  ./start-all.sh --version
                  +
                  +
                  +

                  To validate the Scylla-Monitoring version.

                  +
                  +
                  +

                  Validate the version installed correctly

                  +

                  To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                  +
                  ./start-all.sh -p 9091 -g 3001 -m 9095
                  +
                  +
                  +

                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                  +

                  Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                  +
                  +

                  Caution

                  +

                  Important: do not use the local dir flag when testing!

                  +
                  +

                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                  +
                  +

                  Caution

                  +

                  Important: Do not kill the 2.x version that is currently running.

                  +
                  +

                  Use the following command to kill the containers:

                  +
                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                  +
                  +
                  +

                  You can start and stop the new 2.y version while testing.

                  +
                  +
                  +

                  Move to version 2.y (the new version)

                  +

                  Note: migrating will cause a few seconds of blackout in the system.

                  +

                  We assume that you are using external volume to store the metrics data.

                  +
                  +

                  Kill all containers

                  +

                  Follow the instruction on how to kill the 2.y version when in testing mode.

                  +

                  To kill the 2.x version containers, run:

                  +
                  ./kill-all.sh
                  +
                  +
                  +

                  Start version 2.y in normal mode

                  +

                  From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                  +
                  ./start-all.sh -d /path/to/data/dir
                  +
                  +
                  +

                  Point your browser to http://{ip}:3000 and see that the data is there.

                  +
                  +
                  +
                  +

                  Rollback to version 2.x

                  +

                  To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                  +

                  To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                  +
                  ./kill-all.sh
                  +cd /path/to/scylla-grafana-2.x/
                  +./start-all.sh -d /path/to/data/dir
                  +
                  +
                  +
                  +
                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..a76f8286b --- /dev/null +++ b/branch-3.9/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,748 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                  +

                  This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                  + +

                  Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                  +
                  +

                  Upgrade Procedure

                  +
                  +

                  1. Validate node_exporter version

                  +

                  Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                  +

                  If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                  +
                  +
                  +

                  2. Install the new monitoring stack

                  +
                    +
                  1. Download the 3.x version from the release page.

                  2. +
                  3. Unzip it into a different directory.

                  4. +
                  5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                    +
                      +
                    • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                    • +
                    • scylla_manager_servers.yml

                    • +
                    +
                    +
                    +

                    Note

                    +

                    The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                    +
                    +
                    +
                  6. +
                  7. Stop the old monitoring stack

                    +
                    +
                    ./kill-all.sh
                    +
                    +
                    +
                    +
                  8. +
                  9. Start the new monitoring stack

                    +
                    +
                    ./start-all.sh -d /prometheus-data-path
                    +
                    +
                    +
                    +
                  10. +
                  +
                  +
                  +

                  Validate the upgrade

                  +

                  You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                  +

                  Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                  +
                  +
                  +
                  +

                  Rollback

                  +

                  To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                  +
                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-3.9/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..00d95d902 --- /dev/null +++ b/branch-3.9/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,799 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                  +

                  This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                  + +
                  +

                  Upgrade Procedure

                  +

                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                  +

                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                  +
                  +

                  Install 3.y (The new version)

                  +
                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                  +unzip scylla-monitoring-3.y.zip
                  +cd scylla-monitoring-scylla-monitoring-3.y/
                  +
                  +
                  +

                  Replace “y” with the new minor release number, for example, 3.0.1.zip

                  +
                  +
                  +

                  Setting the server’s files

                  +

                  Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                  +
                  cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                  +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                  +
                  +
                  +
                  +
                  +

                  Validate the new version is running the correct version

                  +

                  Starting from Scylla-Monitoring version 2.2, you can run:

                  +
                  ./start-all.sh --version
                  +
                  +
                  +

                  To validate the Scylla-Monitoring version.

                  +
                  +
                  +

                  Validate the version installed correctly

                  +

                  To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                  +
                  ./start-all.sh -p 9091 -g 3001 -m 9095
                  +
                  +
                  +

                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                  +

                  Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                  +
                  +

                  Caution

                  +

                  Important: do not use the local dir flag when testing!

                  +
                  +

                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                  +
                  +

                  Caution

                  +

                  Important: Do not kill the 3.x version that is currently running.

                  +
                  +
                  +
                  +

                  Killing the new 3.y Monitoring stack in testing mode

                  +

                  Use the following command to kill the containers:

                  +
                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                  +
                  +
                  +

                  You can start and stop the new 3.y version while testing.

                  +
                  +
                  +

                  Move to version 3.y (the new version)

                  +

                  Note: migrating will cause a few seconds of blackout in the system.

                  +

                  We assume that you are using external volume to store the metrics data.

                  +
                  +

                  Kill all containers

                  +

                  At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                  +

                  Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                  +

                  kill the older 3.x version containers by running:

                  +
                  ./kill-all.sh
                  +
                  +
                  +

                  Start version 3.y in normal mode

                  +

                  From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                  +
                  ./start-all.sh -d /path/to/data/dir
                  +
                  +
                  +

                  Point your browser to http://{ip}:3000 and see that the data is there.

                  +
                  +
                  +
                  +

                  Rollback to version 3.x

                  +

                  To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                  +

                  To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                  +
                  ./kill-all.sh
                  +cd /path/to/scylla-grafana-3.x/
                  +./start-all.sh -d /path/to/data/dir
                  +
                  +
                  +
                  +
                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlAllowFiltering.html b/branch-3.9/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..72f99c53f --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries use ALLOW FILTERING

                  +

                  Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                  +

                  These kinds of queries can create a bigger load on Scylla, and should be used with care.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlCLAll.html b/branch-3.9/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..beef4bdcc --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries use Consistency Level: ALL

                  +

                  Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                  +

                  Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                  +

                  Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlCLAny.html b/branch-3.9/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..a038f6ad9 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries use Consistency Level: ANY

                  +

                  Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                  +

                  Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlNoTokenAware.html b/branch-3.9/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..2453cb72f --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries are not token-aware

                  +

                  Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                  +

                  Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlNonPaged.html b/branch-3.9/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..ebb4ea67d --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some SELECT queries are non-paged

                  +

                  By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                  +
                  +

                  Blog-post Links

                  +

                  https://www.scylladb.com/2018/07/13/efficient-query-paging/

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlNonPrepared.html b/branch-3.9/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..291e91095 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries are non-prepared

                  +

                  Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/cqlReverseOrder.html b/branch-3.9/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..40636616e --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Some queries use reverse order

                  +

                  Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                  +

                  Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/index.html b/branch-3.9/use-monitoring/advisor/index.html new file mode 100644 index 000000000..562e15a49 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/index.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Scylla Monitoring Stack Advisor

                  +
                  +
                  +

                  The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognize bad practices, bad configurations, and potential problems and advises on how to solve them.

                  +
                  +

                  The Advisor section

                  +
                  +../../_images/advisor_panel.png +
                  +

                  The Advisor section

                  +
                  +
                  +

                  The Advisor section is located on the Overview dashboard and consists of two parts:

                  +

                  On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                  +

                  For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                  +

                  On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                  +

                  For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                  +

                  Each Advisor issue is explained in detail:

                  + +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/nodeCLErrors.html b/branch-3.9/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..693ab5590 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Some operation failed due to unsatisfied consistency level

                  +

                  ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                  +

                  For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                  +

                  When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/nodeIOErrors.html b/branch-3.9/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..11c8e6a7e --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  I/O Errors can indicate a node with a faulty disk

                  +

                  I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/nodeLocalErrors.html b/branch-3.9/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..7cb9490a0 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Some operations failed on the replica side

                  +

                  ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                  +

                  An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-3.9/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..2e501883e --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  CQL queries are not balanced among shards

                  +

                  For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                  +

                  There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                  +
                  +

                  Blog post link

                  +

                  https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/advisor/preparedCacheEviction.html b/branch-3.9/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..a89090623 --- /dev/null +++ b/branch-3.9/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  Prepared statements cache eviction

                  +

                  Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                  +
                    +
                  • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                  • +
                  • The prepared statements cache might be too small for the number of prepared statements.

                  • +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/cql_optimization.html b/branch-3.9/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..9e7a79b32 --- /dev/null +++ b/branch-3.9/use-monitoring/cql_optimization.html @@ -0,0 +1,783 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + + + +
                  +

                  The CQL Optimization

                  +

                  The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potentials issues with queries, data model and driver.

                  +
                  +../_images/cql_optimization_master.png +
                  +

                  The CQL Dashboard

                  +
                  +
                  +

                  The upper part of the dashboard holds CQL related metrics.

                  +

                  The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                  +
                  +

                  Note

                  +

                  Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                  +
                  +

                  The following sections describe each of the dashboard’s panel

                  +
                  +

                  Prepared Statements

                  +

                  Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                  +

                  Using prepared statements has the following benefits:

                  +
                    +
                  • The database only needs to parse the query once

                  • +
                  • The driver can route the query to the right node

                  • +
                  • Using place-holders and values is safer and prevents CQL-Injection

                  • +
                  +

                  The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                  +

                  The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                  +
                  +
                  +

                  Token Aware

                  +

                  Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                  +

                  Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                  +

                  The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                  +

                  The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                  +
                  +
                  +

                  Paged Queries

                  +

                  By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                  +

                  The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                  +

                  The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                  +
                  +
                  +

                  Reversed CQL Reads

                  +

                  Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                  +

                  Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                  +

                  For example, look at the following table:

                  +
                  CREATE TABLE ks1.table_demo (
                  +   category text,
                  +   type int,
                  +   PRIMARY KEY (category, type))
                  +WITH CLUSTERING ORDER BY (type DESC);
                  +
                  +
                  +

                  The following query uses reverse order:

                  +
                  select * from ks1.table_demo where category='cat1' order by type ASC;
                  +
                  +
                  +

                  The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                  +

                  The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                  +
                  +
                  +

                  ALLOW FILTERING

                  +

                  Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                  +

                  These kinds of queries can create a big load on the system, and should be used with care.

                  +

                  The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                  +

                  The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                  +

                  The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                  +

                  The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                  +

                  The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                  +
                  +
                  +

                  Consistency Level

                  +

                  Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                  +

                  The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                  +

                  Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                  +

                  The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                  +

                  The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                  +

                  The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                  +

                  The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                  +
                  +
                  +

                  Cross DC

                  +

                  Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                  +
                  +
                  +

                  Cross DC Consistency Level

                  +

                  Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                  +
                  +
                  +

                  Cross DC read requests

                  +
                  +

                  Note

                  +

                  The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                  +
                  +

                  In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                  +

                  The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                  +
                  +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-3.9/use-monitoring/index.html b/branch-3.9/use-monitoring/index.html new file mode 100644 index 000000000..07f20f346 --- /dev/null +++ b/branch-3.9/use-monitoring/index.html @@ -0,0 +1,654 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +
                  +

                  Using Scylla Monitoring Stack

                  +
                  +
                  +

                  There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                  + +
                  + + +
                  + + + + + + + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-4.0/.buildinfo b/branch-4.0/.buildinfo new file mode 100644 index 000000000..efc20e514 --- /dev/null +++ b/branch-4.0/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: a79b31ee2ad66d14a8b970ecea10c52c +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.0/.doctrees/_common/monitor-description.doctree b/branch-4.0/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..108b1812e Binary files /dev/null and b/branch-4.0/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-4.0/.doctrees/environment.pickle b/branch-4.0/.doctrees/environment.pickle new file mode 100644 index 000000000..939793943 Binary files /dev/null and b/branch-4.0/.doctrees/environment.pickle differ diff --git a/branch-4.0/.doctrees/index.doctree b/branch-4.0/.doctrees/index.doctree new file mode 100644 index 000000000..6997ad598 Binary files /dev/null and b/branch-4.0/.doctrees/index.doctree differ diff --git a/branch-4.0/.doctrees/install/docker_compose.doctree b/branch-4.0/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..7acdd3340 Binary files /dev/null and b/branch-4.0/.doctrees/install/docker_compose.doctree differ diff --git a/branch-4.0/.doctrees/install/index.doctree b/branch-4.0/.doctrees/install/index.doctree new file mode 100644 index 000000000..a58f6f308 Binary files /dev/null and b/branch-4.0/.doctrees/install/index.doctree differ diff --git a/branch-4.0/.doctrees/install/min-prod-hw.doctree b/branch-4.0/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..d2ddbfad8 Binary files /dev/null and b/branch-4.0/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.0/.doctrees/install/monitor_without_docker.doctree b/branch-4.0/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..0d342e6f9 Binary files /dev/null and b/branch-4.0/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-4.0/.doctrees/install/monitoring_stack.doctree b/branch-4.0/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..384d5b0e9 Binary files /dev/null and b/branch-4.0/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-4.0/.doctrees/install/start_all.doctree b/branch-4.0/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..23bef089f Binary files /dev/null and b/branch-4.0/.doctrees/install/start_all.doctree differ diff --git a/branch-4.0/.doctrees/install/thanos.doctree b/branch-4.0/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..c020babf4 Binary files /dev/null and b/branch-4.0/.doctrees/install/thanos.doctree differ diff --git a/branch-4.0/.doctrees/intro.doctree b/branch-4.0/.doctrees/intro.doctree new file mode 100644 index 000000000..d4c3a54d3 Binary files /dev/null and b/branch-4.0/.doctrees/intro.doctree differ diff --git a/branch-4.0/.doctrees/procedures/alerts/alerting.doctree b/branch-4.0/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..b845bb1fe Binary files /dev/null and b/branch-4.0/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.0/.doctrees/procedures/alerts/index.doctree b/branch-4.0/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..a6c3a778a Binary files /dev/null and b/branch-4.0/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.0/.doctrees/procedures/index.doctree b/branch-4.0/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..b24d8ffb0 Binary files /dev/null and b/branch-4.0/.doctrees/procedures/index.doctree differ diff --git a/branch-4.0/.doctrees/procedures/updating_dashboard.doctree b/branch-4.0/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..d9d39a79b Binary files /dev/null and b/branch-4.0/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-4.0/.doctrees/reference/index.doctree b/branch-4.0/.doctrees/reference/index.doctree new file mode 100644 index 000000000..9698e1264 Binary files /dev/null and b/branch-4.0/.doctrees/reference/index.doctree differ diff --git a/branch-4.0/.doctrees/reference/matrix.doctree b/branch-4.0/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..5dcf0b858 Binary files /dev/null and b/branch-4.0/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.0/.doctrees/reference/monitoring_apis.doctree b/branch-4.0/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..6b92a10ca Binary files /dev/null and b/branch-4.0/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-4.0/.doctrees/troubleshooting/index.doctree b/branch-4.0/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..d43f4cdf4 Binary files /dev/null and b/branch-4.0/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.0/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-4.0/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..3084b0af9 Binary files /dev/null and b/branch-4.0/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/index.doctree b/branch-4.0/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..d64a8789f Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..33943c007 Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..dfea4170d Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..eb2fb8d28 Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..44d685073 Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..e4065fef6 Binary files /dev/null and b/branch-4.0/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..54cc761c1 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..116deb46c Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..62907ff68 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..b895c6400 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..063c2e626 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..88db39e78 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..31e7fa0a6 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..ccaa9f92e Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..ed0acca4c Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..5dc65f4c3 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..64b946ad1 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..8278323f8 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..149774700 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..8fa78ed00 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.0/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..d573cb766 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/cql_optimization.doctree b/branch-4.0/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..cfa5d0737 Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-4.0/.doctrees/use-monitoring/index.doctree b/branch-4.0/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..b8c9f779c Binary files /dev/null and b/branch-4.0/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.0/.nojekyll b/branch-4.0/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.0/404.html b/branch-4.0/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.0/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                  +

                  404

                  +

                  The ScyllaDB monster ate your page!

                  +

                  + Home +

                  +
                  + + + \ No newline at end of file diff --git a/branch-4.0/CNAME b/branch-4.0/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.0/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.0/_common/monitor-description.html b/branch-4.0/_common/monitor-description.html new file mode 100644 index 000000000..8d4f92d31 --- /dev/null +++ b/branch-4.0/_common/monitor-description.html @@ -0,0 +1,638 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + +
                  +
                  + Menu +
                  +
                  +
                  +
                  +
                  + + +
                  +

                  Caution

                  +

                  + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                  +
                  + + + +
                  + +
                  + +

                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                  + + +
                  + + + + + +
                  + + +
                  + +
                  + +
                  + + + + +
                  + + + + + + + \ No newline at end of file diff --git a/branch-4.0/_images/1.png b/branch-4.0/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.0/_images/1.png differ diff --git a/branch-4.0/_images/2.png b/branch-4.0/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.0/_images/2.png differ diff --git a/branch-4.0/_images/3.png b/branch-4.0/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.0/_images/3.png differ diff --git a/branch-4.0/_images/advisor_panel.png b/branch-4.0/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.0/_images/advisor_panel.png differ diff --git a/branch-4.0/_images/after-backfilling.jpg b/branch-4.0/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.0/_images/after-backfilling.jpg differ diff --git a/branch-4.0/_images/alertmanager.png b/branch-4.0/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.0/_images/alertmanager.png differ diff --git a/branch-4.0/_images/before-backfilling.png b/branch-4.0/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.0/_images/before-backfilling.png differ diff --git a/branch-4.0/_images/cql_optimization_master.png b/branch-4.0/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.0/_images/cql_optimization_master.png differ diff --git a/branch-4.0/_images/grafana.png b/branch-4.0/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.0/_images/grafana.png differ diff --git a/branch-4.0/_images/monitor.png b/branch-4.0/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.0/_images/monitor.png differ diff --git a/branch-4.0/_images/monitoring_stack.png b/branch-4.0/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.0/_images/monitoring_stack.png differ diff --git a/branch-4.0/_images/monitoring_stack1.png b/branch-4.0/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.0/_images/monitoring_stack1.png differ diff --git a/branch-4.0/_sources/_common/monitor-description.rst.txt b/branch-4.0/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..ef319881a --- /dev/null +++ b/branch-4.0/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. diff --git a/branch-4.0/_sources/index.rst.txt b/branch-4.0/_sources/index.rst.txt new file mode 100644 index 000000000..9233bc21d --- /dev/null +++ b/branch-4.0/_sources/index.rst.txt @@ -0,0 +1,42 @@ +======================== +Scylla Monitoring Stack +======================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `Scylla Monitoring Stack lesson `_ on Scylla University +* `Scylla Monitoring Stack GitHub Project `_ + +For older versions of Scylla Monitoring Stack Documentation see `here `_. \ No newline at end of file diff --git a/branch-4.0/_sources/install/docker_compose.rst.txt b/branch-4.0/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.0/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.0/_sources/install/index.rst.txt b/branch-4.0/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-4.0/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.0/_sources/install/min-prod-hw.rst.txt b/branch-4.0/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..443638374 --- /dev/null +++ b/branch-4.0/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,32 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. diff --git a/branch-4.0/_sources/install/monitor_without_docker.rst.txt b/branch-4.0/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..08b771b73 --- /dev/null +++ b/branch-4.0/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.0/_sources/install/monitoring_stack.rst.txt b/branch-4.0/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..b0f466b32 --- /dev/null +++ b/branch-4.0/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,389 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API `_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker ` . +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.0/_sources/install/start_all.rst.txt b/branch-4.0/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..c2e927a99 --- /dev/null +++ b/branch-4.0/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.0/_sources/install/thanos.rst.txt b/branch-4.0/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.0/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.0/_sources/intro.rst.txt b/branch-4.0/_sources/intro.rst.txt new file mode 100644 index 000000000..8bad4d48a --- /dev/null +++ b/branch-4.0/_sources/intro.rst.txt @@ -0,0 +1,49 @@ +======================= +Scylla Monitoring Stack +======================= + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the `node_exporter` agent that runs on the Scylla server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `Scylla Monitoring Stack lesson `_ on Scylla University + + +For older versions of Scylla Monitoring Stack Documentation see `here `_. diff --git a/branch-4.0/_sources/procedures/alerts/alerting.rst.txt b/branch-4.0/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.0/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.0/_sources/procedures/alerts/index.rst.txt b/branch-4.0/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.0/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.0/_sources/procedures/index.rst.txt b/branch-4.0/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..5ad1f631f --- /dev/null +++ b/branch-4.0/_sources/procedures/index.rst.txt @@ -0,0 +1,18 @@ +========================================= +Scylla Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Alert Manager + Adding and Modifying Dashboards + Upgrade Guide + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* `Upgrade Guide `_ diff --git a/branch-4.0/_sources/procedures/updating_dashboard.rst.txt b/branch-4.0/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.0/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.0/_sources/reference/index.rst.txt b/branch-4.0/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-4.0/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.0/_sources/reference/matrix.rst.txt b/branch-4.0/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..ca9bd522b --- /dev/null +++ b/branch-4.0/_sources/reference/matrix.rst.txt @@ -0,0 +1,125 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.0/_sources/reference/monitoring_apis.rst.txt b/branch-4.0/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-4.0/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.0/_sources/troubleshooting/index.rst.txt b/branch-4.0/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-4.0/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.0/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-4.0/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..a2e14a1f4 --- /dev/null +++ b/branch-4.0/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,221 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.0/_sources/upgrade/index.rst.txt b/branch-4.0/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..817f65247 --- /dev/null +++ b/branch-4.0/_sources/upgrade/index.rst.txt @@ -0,0 +1,42 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                  +
                  +
                  +
                  Upgrade Scylla Open Source
                  +
                  +
                  + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                  +
                  +
                  diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade
                  ` +* `Prometheus Migration `_ diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..b64fd5d7e --- /dev/null +++ b/branch-4.0/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,281 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.0/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.0/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.0/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.0/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.0/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.0/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.0/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.0/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.0/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.0/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.0/_sources/use-monitoring/cql_optimization.rst.txt b/branch-4.0/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.0/_sources/use-monitoring/index.rst.txt b/branch-4.0/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-4.0/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.0/_static/basic.css b/branch-4.0/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.0/_static/check-solid.svg b/branch-4.0/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.0/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.0/_static/clipboard.min.js b/branch-4.0/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.0/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.0/_static/copybutton.css b/branch-4.0/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.0/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                  Short

                  + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.0/_static/copybutton.js b/branch-4.0/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.0/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.0/_static/copybutton_funcs.js b/branch-4.0/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.0/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.0/_static/css/main.css b/branch-4.0/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-4.0/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.0/_static/doctools.js b/branch-4.0/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.0/_static/documentation_options.js b/branch-4.0/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.0/_static/file.png b/branch-4.0/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.0/_static/file.png differ diff --git a/branch-4.0/_static/img/banner-background.svg b/branch-4.0/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.0/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.0/_static/img/favicon-228x228.png b/branch-4.0/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.0/_static/img/favicon-228x228.png differ diff --git a/branch-4.0/_static/img/favicon-32x32.png b/branch-4.0/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.0/_static/img/favicon-32x32.png differ diff --git a/branch-4.0/_static/img/favicon.ico b/branch-4.0/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.0/_static/img/favicon.ico differ diff --git a/branch-4.0/_static/img/icons/icon-about-team.svg b/branch-4.0/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.0/_static/img/icons/icon-about-us-m.svg b/branch-4.0/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-about-us.svg b/branch-4.0/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-alternator.svg b/branch-4.0/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-apps.svg b/branch-4.0/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-architecture.svg b/branch-4.0/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.0/_static/img/icons/icon-benchmarks.svg b/branch-4.0/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.0/_static/img/icons/icon-blog.svg b/branch-4.0/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.0/_static/img/icons/icon-careers.svg b/branch-4.0/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.0/_static/img/icons/icon-chevron-left.svg b/branch-4.0/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.0/_static/img/icons/icon-chevron-right.svg b/branch-4.0/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.0/_static/img/icons/icon-circe.svg b/branch-4.0/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-clock.svg b/branch-4.0/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-close.svg b/branch-4.0/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-cloud-docs.svg b/branch-4.0/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-cloud.svg b/branch-4.0/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-comparison.svg b/branch-4.0/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.0/_static/img/icons/icon-contact-us.svg b/branch-4.0/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.0/_static/img/icons/icon-developers-blog.svg b/branch-4.0/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.0/_static/img/icons/icon-docs.svg b/branch-4.0/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.0/_static/img/icons/icon-enterprise-m.svg b/branch-4.0/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-enterprise.svg b/branch-4.0/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-events.svg b/branch-4.0/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.0/_static/img/icons/icon-exclamation.svg b/branch-4.0/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-expand.svg b/branch-4.0/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-forum.svg b/branch-4.0/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-getting-started.svg b/branch-4.0/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-glossary.svg b/branch-4.0/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-home.svg b/branch-4.0/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-infoworld.svg b/branch-4.0/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.0/_static/img/icons/icon-integrations.svg b/branch-4.0/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-knowledge-base.svg b/branch-4.0/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-less.svg b/branch-4.0/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-live-test.svg b/branch-4.0/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.0/_static/img/icons/icon-mail-list.svg b/branch-4.0/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-manager.svg b/branch-4.0/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.0/_static/img/icons/icon-memory-management.svg b/branch-4.0/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.0/_static/img/icons/icon-modeling.svg b/branch-4.0/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-monitoring.svg b/branch-4.0/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.0/_static/img/icons/icon-networking.svg b/branch-4.0/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.0/_static/img/icons/icon-news.svg b/branch-4.0/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.0/_static/img/icons/icon-newsletter.svg b/branch-4.0/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.0/_static/img/icons/icon-nsql-guides.svg b/branch-4.0/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.0/_static/img/icons/icon-open-source.svg b/branch-4.0/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.0/_static/img/icons/icon-operator.svg b/branch-4.0/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-overview.svg b/branch-4.0/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.0/_static/img/icons/icon-partners.svg b/branch-4.0/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.0/_static/img/icons/icon-plus.svg b/branch-4.0/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-pricing.svg b/branch-4.0/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.0/_static/img/icons/icon-release-notes.svg b/branch-4.0/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.0/_static/img/icons/icon-resource-center.svg b/branch-4.0/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.0/_static/img/icons/icon-roadmap.svg b/branch-4.0/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.0/_static/img/icons/icon-search.svg b/branch-4.0/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.0/_static/img/icons/icon-slack.svg b/branch-4.0/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-stack-overflow.svg b/branch-4.0/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.0/_static/img/icons/icon-summit.svg b/branch-4.0/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/icons/icon-support.svg b/branch-4.0/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.0/_static/img/icons/icon-tech-talks.svg b/branch-4.0/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.0/_static/img/icons/icon-testing.svg b/branch-4.0/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.0/_static/img/icons/icon-thumbs-down.svg b/branch-4.0/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-thumbs-up.svg b/branch-4.0/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.0/_static/img/icons/icon-tip.svg b/branch-4.0/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.0/_static/img/icons/icon-training.svg b/branch-4.0/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.0/_static/img/icons/icon-triangle-down.svg b/branch-4.0/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.0/_static/img/icons/icon-university.svg b/branch-4.0/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.0/_static/img/icons/icon-users-blog.svg b/branch-4.0/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.0/_static/img/icons/icon-warning.svg b/branch-4.0/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.0/_static/img/icons/icon-webinars.svg b/branch-4.0/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.0/_static/img/icons/icon-whitepapers.svg b/branch-4.0/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.0/_static/img/icons/icon-workshop.svg b/branch-4.0/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.0/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.0/_static/img/logo-docs.svg b/branch-4.0/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.0/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.0/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.0/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.0/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.0/_static/img/mascots/404.jpg b/branch-4.0/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.0/_static/img/mascots/404.jpg differ diff --git a/branch-4.0/_static/img/mascots/scylla-3monsters.png b/branch-4.0/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.0/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-alternator.svg b/branch-4.0/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.0/_static/img/mascots/scylla-cloud.svg b/branch-4.0/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.0/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.0/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-computer-headset.png b/branch-4.0/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-cup-number-one.png b/branch-4.0/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-docs.svg b/branch-4.0/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.0/_static/img/mascots/scylla-drivers.svg b/branch-4.0/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.0/_static/img/mascots/scylla-enterprise.svg b/branch-4.0/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.0/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.0/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-forklift-migration.png b/branch-4.0/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-gear.png b/branch-4.0/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-hardhat.png b/branch-4.0/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-headband.png b/branch-4.0/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-headset.png b/branch-4.0/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-hearts.png b/branch-4.0/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-looking-down.png b/branch-4.0/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-looking-up.png b/branch-4.0/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.0/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.0/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-manager.svg b/branch-4.0/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.0/_static/img/mascots/scylla-monitor.svg b/branch-4.0/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.0/_static/img/mascots/scylla-movement-fast.png b/branch-4.0/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-movement.png b/branch-4.0/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-onpremise.png b/branch-4.0/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-opensource.svg b/branch-4.0/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.0/_static/img/mascots/scylla-operator.svg b/branch-4.0/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.0/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.0/_static/img/mascots/scylla-plugin.png b/branch-4.0/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-release-mascot.png b/branch-4.0/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-repair.png b/branch-4.0/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-server.png b/branch-4.0/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-sleeping.png b/branch-4.0/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-tall-measure.png b/branch-4.0/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-university.png b/branch-4.0/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-weights.png b/branch-4.0/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-window-cleaning.png b/branch-4.0/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-with-computer-2.png b/branch-4.0/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-with-computer.png b/branch-4.0/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-with-linux.png b/branch-4.0/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.0/_static/img/mascots/scylla-writting.png b/branch-4.0/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.0/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.0/_static/img/menu.svg b/branch-4.0/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.0/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.0/_static/img/scylla-monitor.png b/branch-4.0/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.0/_static/img/scylla-monitor.png differ diff --git a/branch-4.0/_static/js/main.bundle.js b/branch-4.0/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-4.0/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                • Back
                • ',backButtonPosition:"top",wrapper:"
                  ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                    "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                    ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                    ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                    ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                    ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                    "],col:[2,"","
                    "],tr:[2,"","
                    "],td:[3,"","
                    "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + + + +
                    + + + + + +
                    + + +
                    + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/index.html b/branch-4.0/index.html new file mode 100644 index 000000000..61e7ed6ba --- /dev/null +++ b/branch-4.0/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack

                    +
                    +
                    +

                    Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                    +_images/monitor.png +

                    The Scylla Monitoring Stack consists of three components, wrapped in Docker containers:

                    +
                      +
                    • prometheus - collects and stores metrics

                    • +
                    • alertmanager - handles alerts

                    • +
                    • grafana - dashboard server

                    • +
                    +

                    Choose a topic to get started:

                    + +

                    For older versions of Scylla Monitoring Stack Documentation see here.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/docker_compose.html b/branch-4.0/install/docker_compose.html new file mode 100644 index 000000000..005ccf0ed --- /dev/null +++ b/branch-4.0/install/docker_compose.html @@ -0,0 +1,802 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Using Docker Compose

                    +

                    Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                    +

                    Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                    +
                    +

                    Warning

                    +

                    docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                    +
                    +
                    +

                    Prerequisite

                    +

                    Make sure you have docker and docker-compose installed.

                    +
                    +
                    +

                    Setting Prometheus

                    +

                    The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                    +

                    You can use ./prometheus-config.sh to generate the file, for example:

                    +
                    ./prometheus-config.sh --compose
                    +
                    +
                    +

                    For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                    +
                    +
                    +

                    Setting Grafana Provisioning

                    +

                    Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                    +
                    +

                    Grafana Data-Source file

                    +

                    Run the following command to update the datasource:

                    +
                    ./grafana-datasource.sh --compose
                    +
                    +
                    +

                    You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                    +
                    +
                    +

                    Grafana Dashboard Load file

                    +

                    To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                    +
                    ./generate-dashboards.sh -t -v 2020.1
                    +
                    +
                    +

                    This command generates the files under: grafana/provisioning/dashboards/

                    +
                    +
                    +
                    +

                    Docker Compose file

                    +

                    You can use the following example as a base for your docker compose.

                    +

                    Pass the following to a file called docker-compose.yml

                    +
                    services:
                    +  alertmanager:
                    +    container_name: aalert
                    +    image: prom/alertmanager:v0.21.0
                    +    ports:
                    +    - 9093:9093
                    +    volumes:
                    +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                    +  grafana:
                    +    container_name: agraf
                    +    environment:
                    +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                    +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                    +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                    +    # This is where you set Grafana security
                    +    - GF_AUTH_BASIC_ENABLED=false
                    +    - GF_AUTH_ANONYMOUS_ENABLED=true
                    +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                    +    - GF_SECURITY_ADMIN_PASSWORD=admin
                    +    image: grafana/grafana:7.3.5
                    +    ports:
                    +    - 3000:3000
                    +    user: 1000:1000
                    +    volumes:
                    +    - ./grafana/build:/var/lib/grafana/dashboards
                    +    - ./grafana/plugins:/var/lib/grafana/plugins
                    +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                    +    # Uncomment the following line for grafana persistency
                    +    # - path/to/grafana/dir:/var/lib/grafana
                    +  loki:
                    +    command:
                    +    - --config.file=/mnt/config/loki-config.yaml
                    +    container_name: loki
                    +    image: grafana/loki:2.0.0
                    +    ports:
                    +    - 3100:3100
                    +    volumes:
                    +    - ./loki/rules:/etc/loki/rules
                    +    - ./loki/conf:/mnt/config
                    +  prometheus:
                    +    command:
                    +    - --config.file=/etc/prometheus/prometheus.compose.yml
                    +    container_name: aprom
                    +    image: prom/prometheus:v2.18.1
                    +    ports:
                    +    - 9090:9090
                    +    volumes:
                    +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                    +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                    +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                    +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                    +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                    +    # Uncomment the following line for prometheus persistency 
                    +    # - path/to/data/dir:/prometheus/data
                    +  promtail:
                    +    command:
                    +    - --config.file=/etc/promtail/config.yml
                    +    container_name: promtail
                    +    image: grafana/promtail:2.0.0
                    +    ports:
                    +    - 1514:1514
                    +    - 9080:9080
                    +    volumes:
                    +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                    +version: '3'
                    +
                    +
                    +
                    +

                    Start and Stop

                    +

                    To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/index.html b/branch-4.0/install/index.html new file mode 100644 index 000000000..6d75c13b0 --- /dev/null +++ b/branch-4.0/install/index.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Download and Install Scylla Monitoring Stack

                    +
                    +
                    +

                    Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                    +

                    Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/min-prod-hw.html b/branch-4.0/install/min-prod-hw.html new file mode 100644 index 000000000..dc4aa11c3 --- /dev/null +++ b/branch-4.0/install/min-prod-hw.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Minimal Production System Recommendations

                    +
                      +
                    • CPU - at least 2 physical cores/ 4vCPUs

                    • +
                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                    • +
                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                    • +
                    • Network - 1GbE/10GbE preferred

                    • +
                    +
                    +

                    Calculating Prometheus Minimal Disk Space requirement

                    +

                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                    +

                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                    +

                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                    +
                    6 * 16 * 15 * 12MB ~ 16GB
                    +
                    +
                    +

                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                    +
                    +
                    +

                    Calculating Prometheus Minimal Memory Space requirement

                    +

                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                    +

                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/monitor_without_docker.html b/branch-4.0/install/monitor_without_docker.html new file mode 100644 index 000000000..bb4551bc8 --- /dev/null +++ b/branch-4.0/install/monitor_without_docker.html @@ -0,0 +1,1108 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Deploying Scylla Monitoring Stack Without Docker

                    +
                    +

                    Introduction

                    +

                    The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                    +

                    Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                    +

                    Scylla Monitoring uses the following components:

                    +
                      +
                    • Alertmanager

                    • +
                    • Grafana Loki

                    • +
                    • Prometheus

                    • +
                    • Grafana

                    • +
                    +

                    The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                    +

                    We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                    +
                    +
                    +

                    Minimal Production System Recommendations

                    +
                      +
                    • CPU - at least 2 physical cores/ 4vCPUs

                    • +
                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                    • +
                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                    • +
                    • Network - 1GbE/10GbE preferred

                    • +
                    +
                    +

                    Calculating Prometheus Minimal Disk Space requirement

                    +

                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                    +

                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                    +

                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                    +
                    6 * 16 * 15 * 12MB ~ 16GB
                    +
                    +
                    +

                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                    +
                    +
                    +

                    Calculating Prometheus Minimal Memory Space requirement

                    +

                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                    +

                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                    +

                    The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                    +
                    +

                    Note

                    +

                    Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                    +
                    +
                    +
                    +
                    +

                    Install Scylla Monitoring Stack

                    +

                    The following procedure uses a CentOS 7 based instance

                    +
                      +
                    1. Download the latest Scylla Monitoring Stack release.

                    2. +
                    +
                    wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.0.2.tar.gz
                    +
                    +
                    +
                      +
                    1. Open the tar

                    2. +
                    +

                    tar -xvf scylla-monitoring-*.tar.gz

                    +
                    +
                    +

                    Install Alertmanager

                    +

                    Tested with alertmanager 0.22.2 version

                    +
                      +
                    1. Install alertmanager

                    2. +
                    +
                    wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                    +tar -xvf alertmanager-*.linux-amd64.tar.gz
                    +
                    +
                    +
                      +
                    1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                    2. +
                    +

                    For example:

                    +
                    cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.0.2/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                    +
                    +
                    +
                      +
                    1. Start the Alertmanager

                    2. +
                    +

                    For example:

                    +
                    cd alertmanager-0.22.2.linux-amd64
                    +./alertmanager
                    +
                    +
                    +
                      +
                    1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                    2. +
                    +

                    For example:

                    +
                    http://192.168.135.166:9093/
                    +
                    +
                    +../_images/alertmanager.png +
                    +
                    +

                    Install Grafana Loki

                    +

                    Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                    +

                    We recomand using Loki with containers, but you can install it locally as described in Loki installation

                    +

                    You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                    +

                    Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                    +

                    Loki Related files

                    +

                    Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                    +
                    mkdir -p /etc/loki/rules
                    +mkdir -p /etc/loki/config
                    +cp loki/rules/* /etc/loki/rules
                    +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                    +
                    +
                    +

                    Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                    +

                    Promtail Related files

                    +

                    Promtail has a configuration file. You need to copy and modify the configuration.

                    +
                    mkdir -p /etc/promtail/
                    +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                    +
                    +
                    +

                    Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                    +
                    +
                    +

                    Install Prometheus

                    +

                    Tested with Prometheus version 2.27.1

                    +
                    +

                    Note

                    +

                    If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                    +
                    +
                      +
                    1. Install Prometheus

                    2. +
                    +
                    wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                    +tar -xvf prometheus-*.linux-amd64.tar.gz
                    +
                    +
                    +

                    2. Create Data and Config directories +.. code-block:: shell

                    +
                    +

                    mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                    +
                    +
                      +
                    1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                    2. +
                    +

                    Copy prometheus/prometheus.yml.template to prometheus.yml

                    +

                    For example:

                    +
                    cp scylla-monitoring-scylla-monitoring-4.0.2/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
                    +cp scylla-monitoring-scylla-monitoring-4.0.2/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                    +
                    +
                    +
                      +
                    1. Edit the prometheus.yml file to point to the correct static data sources.

                    2. +
                    +
                    +

                    Note

                    +

                    Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                    +
                    +
                    vi /etc/prometheus/prometheus.yml
                    +
                    +
                    +

                    Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                    +

                    For example if the alertmanager will run on the same host:

                    +
                    alerting:
                    +   alertmanagers:
                    +   - static_configs:
                    +       - targets:
                    +           - 127.0.0.1:9093
                    +
                    +
                    +

                    Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                    +

                    For example the scrape config for Scylla:

                    +
                    global:
                    +  scrape_interval: 5s # By default, scrape targets every 5 second.
                    +  scrape_timeout: 4s # Timeout before trying to scape a target again
                    +
                    +  # Attach these labels to any time series or alerts when communicating with
                    +  # external systems (federation, remote storage, Alertmanager).
                    +  external_labels:
                    +    monitor: 'scylla-monitor'
                    +
                    +scrape_configs:
                    +- job_name: scylla
                    +  honor_labels: false
                    +  file_sd_configs:
                    +    - files:
                    +      - /etc/scylla.d/prometheus/scylla_servers.yml
                    +  relabel_configs:
                    +    - source_labels: [__address__]
                    +      regex:  '([^:]+)'
                    +      target_label: __address__
                    +      replacement: '${1}:9180'
                    +
                    +    - source_labels: [__address__]
                    +      regex:  '(.*):.+'
                    +      target_label: instance
                    +      replacement: '${1}'
                    +
                    +
                    +
                      +
                    1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                    2. +
                    +
                    +

                    Note

                    +

                    There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                    +
                    +

                    An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                    +
                    +

                    Note

                    +

                    You must have both files even if you are not using Scylla Manager

                    +
                    +

                    Add the labels for the cluster and data-center

                    +

                    scylla_servers.yml:

                    +

                    For example:

                    +
                    cat scylla_servers.yml
                    +# List Scylla end points
                    +
                    +- targets:
                    +  - 192.168.66.6
                    +  - 192.168.66.244
                    +  labels:
                    +    cluster: cluster1
                    +    dc: dc1
                    +- targets:
                    +    - 172.17.0.3
                    +  labels:
                    +    cluster: cluster1
                    +    dc: dc2
                    +
                    +
                    +
                    +

                    Note

                    +

                    See the previous note about deprecating the node_exporter_servers.yml file.

                    +
                    +

                    scylla_manager_server.yml

                    +

                    For example:

                    +
                    - targets:
                    +  - 127.0.0.1:5090
                    +
                    +
                    +
                      +
                    1. Start Prometheus server:

                    2. +
                    +

                    For example:

                    +
                    cd scylla-monitoring-scylla-monitoring-4.0.2/
                    +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                    +
                    +
                    +

                    Data should start accumulate on: /prometheus/data

                    +
                      +
                    1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                    2. +
                    +

                    For example:

                    +
                    http://192.168.135.166:9090/
                    +
                    +
                    +../_images/1.png +

                    Prometheus console should be visible

                    +
                      +
                    1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                    2. +
                    +

                    For example:

                    +

                    node_memory_MemFree

                    +../_images/2.png +

                    And

                    +

                    scylla_reactor_utilization

                    +../_images/3.png +

                    At this point Scylla is emitting the metrics and Prometheus is able to store them.

                    +
                    +
                    +

                    Install Grafana

                    +

                    Tested with Grafna 7.5.7

                    +
                      +
                    1. Install Grafana based on the instructions here

                    2. +
                    +

                    Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                    +
                      +
                    1. Access Scylla-Grafana-monitoring directory

                    2. +
                    +
                    cd scylla-monitoring-scylla-monitoring-4.0.2/
                    +
                    +
                    +
                      +
                    1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                    2. +
                    +
                    sudo cp -r grafana/plugins /var/lib/grafana/
                    +
                    +
                    +

                    If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                    +

                    For example:

                    +
                    cp -r grafana/plugins ../grafana-7.5.7/public/app
                    +
                    +
                    +
                      +
                    1. Provision the Dashboards

                    2. +
                    +

                    For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                    +

                    For Grafana installed with yum install

                    +
                    sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                    +sudo mkdir -p /var/lib/grafana/dashboards
                    +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                    +
                    +
                    +

                    For Grafana installed from packages

                    +
                    cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                    +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                    +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                    +
                    +
                    +

                    Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                    +
                    +

                    Note

                    +

                    A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                    +
                    +
                      +
                    1. Set the data source by copy datasource.yml and edit it

                    2. +
                    +
                    sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                    +
                    +
                    +
                    +

                    Note

                    +

                    Scylla uses a plugin to read from some system tables see the section below about using it.

                    +
                    +

                    For Grafana installed from packages

                    +
                    cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                    +
                    +
                    +

                    You should set the Prometheus and the alertmanager IP and port.

                    +

                    For example

                    +
                    sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                    +apiVersion: 1
                    +datasources:
                    + - name: prometheus
                    +   type: prometheus
                    +   url: http://192.168.135.167:9090
                    +   access: proxy
                    +   basicAuth: false
                    +
                    + - name: alertmanager
                    +   type: camptocamp-prometheus-alertmanager-datasource
                    +   orgId: 1
                    +   typeLogoUrl: public/img/icn-datasource.svg
                    +   access: proxy
                    +   url: http://192.168.135.166:9093
                    +   password:
                    +   user:
                    +   database:
                    +   basicAuth:
                    +   isDefault:
                    +   jsonData:
                    +     severity_critical: '4'
                    +     severity_high: '3'
                    +     severity_warning: '2'
                    +     severity_info: '1'
                    +
                    +
                    +
                      +
                    1. Start the Grafana service

                    2. +
                    +

                    For Grafana installed with yum install

                    +

                    sudo service grafana-server start

                    +

                    For Grafana installed from packages:

                    +

                    cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                    +

                    Edit scylla.ini to reflect the right paths in the paths section of the file.

                    +
                    plugins = /home/centos/grafana-7.5.7/data/plugins
                    +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                    +
                    +
                    +

                    Start the server:

                    +
                    cd /home/centos/grafana-7.5.7/
                    +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                    +
                    +
                    +
                      +
                    1. Make sure Grafana is running

                    2. +
                    +

                    Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                    +../_images/grafana.png +
                    +
                    +

                    Using Scylla Plugin with Grafana

                    +

                    Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                    +

                    Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                    +
                    +

                    Setting a monitoring user

                    +

                    This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                    +
                      +
                    • If you have not done so, enable authorization first.

                    • +
                    • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                    • +
                    • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                    • +
                    +
                    +
                    +

                    Installing the Plugin

                    +

                    Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                    +
                    +
                    +

                    Configure the Plugin

                    +

                    Add an entry to the datasource.yml file

                    +
                    - name: scylla-datasource
                    +  type: scylladb-scylla-datasource
                    +  orgId: 1
                    +  isDefault:
                    +  jsonData:
                    +  host: ''
                    +#  secureJsonData:
                    +#    user: 'scylla_monitoring'
                    +#    password: 'scylla_monitoring'
                    +
                    +
                    +

                    As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                    +
                    +
                    +

                    Enable the Plugin

                    +

                    Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                    +

                    See more about it the Grafana configurtion.

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/monitoring_stack.html b/branch-4.0/install/monitoring_stack.html new file mode 100644 index 000000000..2acd58edd --- /dev/null +++ b/branch-4.0/install/monitoring_stack.html @@ -0,0 +1,1026 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Install Scylla Monitoring Stack

                    +

                    This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

                    +

                    The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                    +

                    For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                    +
                    +

                    Minimal Production System Recommendations

                    +
                      +
                    • CPU - at least 2 physical cores/ 4vCPUs

                    • +
                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                    • +
                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                    • +
                    • Network - 1GbE/10GbE preferred

                    • +
                    +
                    +

                    Calculating Prometheus Minimal Disk Space requirement

                    +

                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                    +

                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                    +

                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                    +
                    6 * 16 * 15 * 12MB ~ 16GB
                    +
                    +
                    +

                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                    +
                    +
                    +

                    Calculating Prometheus Minimal Memory Space requirement

                    +

                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                    +

                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                    +
                    +
                    +
                    +

                    Prerequisites

                    +
                      +
                    • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker .

                    • +
                    • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                    • +
                    + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    Scylla Monitoring Stack Compatibility Matrix

                    Scylla Monitoring Stack Version

                    Prometheus Version

                    Grafana Version

                    4.0

                    2.34.0

                    8.5.2

                    3.11

                    2.32.0

                    8.3.4

                    3.10

                    2.32.0

                    8.3.3

                    3.9.2

                    2.29.1

                    8.2.7

                    3.9

                    2.29.1

                    8.1.1

                    3.8

                    2.27.1

                    7.5.7

                    3.7

                    2.25.2

                    7.4.0

                    3.6

                    2.18.1

                    7.3.5

                    3.5

                    2.18.1

                    7.1.5

                    3.4

                    2.18.1

                    6.7.3

                    +
                    +
                    +

                    Docker Post Installation

                    +

                    Docker post installation guide can be found here

                    +
                    +

                    Note

                    +

                    Avoid running the container as root.

                    +
                    +

                    To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                    +
                      +
                    1. Create the Docker group.

                    2. +
                    +
                    sudo groupadd docker
                    +
                    +
                    +
                      +
                    1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                    2. +
                    +
                    sudo usermod -aG docker $USER
                    +
                    +
                    +
                      +
                    1. Start Docker by calling:

                    2. +
                    +
                    sudo systemctl enable docker
                    +
                    +
                    +
                    +
                    +

                    Install Scylla Monitoring Stack

                    +

                    Procedure

                    +
                      +
                    1. Download and extract the latest Scylla Monitoring Stack binary;.

                    2. +
                    +
                    wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.0.2.tar.gz
                    +tar -xvf scylla-monitoring-4.0.2.tar.gz
                    +cd scylla-monitoring-scylla-monitoring-4.0.2
                    +
                    +
                    +

                    As an alternative, you can clone and use the Git repository directly.

                    +
                    git clone https://github.com/scylladb/scylla-monitoring.git
                    +cd scylla-monitoring
                    +git checkout branch-4.0
                    +
                    +
                    +
                      +
                    1. Start Docker service if needed

                    2. +
                    +
                    sudo systemctl restart docker
                    +
                    +
                    +
                    +
                    +

                    Configure Scylla Monitoring Stack

                    +

                    To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                    +

                    This configuration can be done from files, or using the Consul api.

                    +

                    Scylla Manager 2.0 and higher supports the Consul API.

                    +
                    +

                    Configure Scylla nodes from files

                    +
                      +
                    1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                    2. +
                    +
                    +

                    Note

                    +

                    It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                    +
                    +

                    For example:

                    +
                    - targets:
                    +      - 172.17.0.2
                    +      - 172.17.0.3
                    +  labels:
                    +      cluster: cluster1
                    +      dc: dc1
                    +
                    +
                    +
                    +

                    Note

                    +

                    If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                    +
                    +

                    Using IPV6

                    +

                    To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                    +

                    For example:

                    +
                    - targets:
                    +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                    +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                    +  labels:
                    +      cluster: cluster1
                    +      dc: dc1
                    +
                    +
                    +
                    +

                    Note

                    +

                    For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                    +
                    +

                    For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                    +
                    +

                    Note

                    +

                    By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                    +
                    +

                    If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                    +

                    For example:

                    +
                    ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                    +
                    +
                    +

                    Mark the different Data Centers with Labels.

                    +

                    As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                    +

                    You can use the genconfig.py script to generate the server file. For example:

                    +
                    ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                    +
                    +
                    +

                    This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                    +

                    OR

                    +

                    The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                    +
                    nodetool status | ./genconfig.py -NS
                    +
                    +
                    +

                    2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                    +

                    You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                    +

                    For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                    +
                    # List Scylla Manager end points
                    +
                    +- targets:
                    +  - 172.17.0.7:5090
                    +
                    +
                    +

                    Note that you do not need to add labels to the Scylla Manager targets.

                    +
                    +
                    +

                    Configure Scylla nodes using Scylla-Manager Consul API

                    +

                    Scylla Manager 2.0 has a Consul like API.

                    +

                    When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                    +

                    For example:

                    +
                    ./start-all.sh -L 10.10.0.1
                    +
                    +
                    +
                    +

                    Note

                    +

                    If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                    +
                    +
                    +
                    +

                    Connecting Scylla-Monitoring to Scylla

                    +

                    Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                    +

                    You can limit the user to read only, currently it only read table from the system keyspace.

                    +

                    To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                    +

                    Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                    +
                    +
                    +

                    Use an external directory for the Prometheus data directory

                    +

                    The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                    +
                    +

                    Note

                    +

                    Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                    +
                    +

                    If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                    +

                    In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                    +
                    +
                    +

                    Add Additional Prometheus Targets

                    +

                    There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                    +

                    The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                    +

                    You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                    +
                    - job_name: 'myservice'
                    +  # Override the global default and scrape targets from this job every 5 seconds.
                    +  scrape_interval: 5s
                    +  static_configs:
                    +    - targets:
                    +      - 17.0.0.1:7000
                    +
                    +
                    +
                    +
                    +
                    +

                    Start and Stop Scylla Monitoring Stack

                    +
                    +

                    Start

                    +
                    ./start-all.sh -d prometheus_data
                    +
                    +
                    +
                    +
                    +

                    Stop

                    +
                    ./kill-all.sh
                    +
                    +
                    +
                    +
                    +

                    Start a Specific Scylla Monitoring Stack Version

                    +

                    By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                    +

                    You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                    +

                    Multiple versions are supported. For example:

                    +
                    ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                    +
                    +
                    +

                    will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                    +
                    +
                    +

                    Accessing the localhost

                    +

                    The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                    +
                    ./start-all.sh -l -d prometheus-data
                    +
                    +
                    +
                    +
                    +

                    Configure rsyslog on each Scylla node

                    +

                    generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                    +

                    Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                    +

                    Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                    +

                    If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                    +
                    if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                    +
                    +
                    +

                    Restart rsyslog for the configuration to take effect.

                    +
                    systemctl restart rsyslog
                    +
                    +
                    +
                    +
                    +
                    +

                    View Grafana Dashboards

                    +

                    Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/start_all.html b/branch-4.0/install/start_all.html new file mode 100644 index 000000000..00bce977c --- /dev/null +++ b/branch-4.0/install/start_all.html @@ -0,0 +1,742 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    The start-all.sh Command

                    +

                    Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                    +

                    The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                    +
                    +

                    General Options

                    +

                    -h Help, Print the help, and exit.

                    +

                    –version print the current Scylla-Monitoring stack version, and exit.

                    +

                    -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                    +

                    -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                    +

                    -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                    +

                    –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                    +
                    + + +
                    +

                    Alert Manager

                    +

                    The Alertmanager handles the alerts and takes the following parameters:

                    +

                    -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                    +

                    -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                    +

                    -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/install/thanos.html b/branch-4.0/install/thanos.html new file mode 100644 index 000000000..415e35e28 --- /dev/null +++ b/branch-4.0/install/thanos.html @@ -0,0 +1,745 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Using Thanos as Data Source With Scylla Monitoring Stack

                    +

                    Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                    +
                      +
                    • High-availability.

                    • +
                    • Horizontal scaling.

                    • +
                    • Backup.

                    • +
                    +

                    The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                    +

                    The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                    +
                    +

                    Using Thanos As a Prometheus Aggregator

                    +

                    There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                    +
                    +

                    Prometheus Configuration

                    +

                    We will assume you have two Prometheus servers running.

                    +
                      +
                    1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                    2. +
                    3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                    4. +
                    +
                    +
                    +

                    Thanos sidecar

                    +

                    The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                    +
                    docker run -d \
                    + -v /path/to/prom/dir:/data/prom:z \
                    + -i --name sidecar thanosio/thanos \
                    + sidecar \
                    + --grpc-address=0.0.0.0:10911 \
                    + --grpc-grace-period=1s \
                    + --http-address=0.0.0.0:10912 \
                    + --http-grace-period=1s \
                    + --prometheus.url=http://prometheus-ip:9090 \
                    + --tsdb.path=/data/prom \
                    + -p 10912:10912 \
                    + -p 10911:10911
                    +
                    +
                    +

                    After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                    +
                    +
                    +

                    Thanos query

                    +

                    Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                    +
                    docker run -d \
                    + --name thanos -- thanosio/thanos \
                    +   query \
                    +   --debug.name=query0 \
                    +   --log.level=debug \
                    +   --grpc-address=0.0.0.0:10903 \
                    +   --grpc-grace-period=1s \
                    +   --http-address=0.0.0.0:10904 \
                    +   --http-grace-period=1s \
                    +   --query.replica-label=prometheus \
                    +   --store={ip1}:10911 --store={ip2}:10911
                    +
                    +
                    +

                    After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                    +
                    +
                    +

                    Update Scylla Data source

                    +

                    The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                    +

                    The file you edit is a template file that replaces the file Grafana uses, next time you start.

                    +

                    Restart the Scylla Monitoring Stack it should now use Thanos.

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/intro.html b/branch-4.0/intro.html new file mode 100644 index 000000000..e5906d7d8 --- /dev/null +++ b/branch-4.0/intro.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack

                    +

                    Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                    +_images/monitor.png +

                    The Scylla Monitoring Stack consists of multiple components, wrapped in Docker containers:

                    +
                      +
                    • prometheus - Collects and stores metrics

                    • +
                    • grafan-loki - Parses logs and generates metrics and alerts

                    • +
                    • alertmanager - Handles alerts

                    • +
                    • grafana - Dashboards server

                    • +
                    +

                    A few optional components are used for additional services

                    +
                      +
                    • grafana-image-renderer - Allows you to download a dashboard as an image.

                    • +
                    • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                    • +
                    +
                    +

                    High Level Architecture

                    +_images/monitoring_stack1.png +

                    We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from Scylla and the +host metrics from the node_exporter agent that runs on the Scylla server.

                    +

                    We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the Scylla servers.

                    +

                    The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                    +

                    We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from Scylla using CQL.

                    +

                    Choose a topic to get started:

                    + +

                    For older versions of Scylla Monitoring Stack Documentation see here.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/objects.inv b/branch-4.0/objects.inv new file mode 100644 index 000000000..47fdee1e0 Binary files /dev/null and b/branch-4.0/objects.inv differ diff --git a/branch-4.0/procedures/alerts/alerting.html b/branch-4.0/procedures/alerts/alerting.html new file mode 100644 index 000000000..2b36da84b --- /dev/null +++ b/branch-4.0/procedures/alerts/alerting.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Alerting

                    +

                    Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                    +

                    You can read more about Prometheus alerting here

                    +

                    By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                    +

                    In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                    +

                    The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                    +../../_images/monitoring_stack.png +
                    +

                    Prometheus Alerts

                    +

                    The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                    +

                    Each alert consists of:

                    +
                      +
                    • Name

                    • +
                    • What happened

                    • +
                    • For how long

                    • +
                    • What to report

                    • +
                    +

                    For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                    +
                    - alert: InstanceDown
                    +  expr: up == 0
                    +  for: 60s
                    +  labels:
                    +    severity: "2"
                    +  annotations:
                    +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                    +    summary: Instance {{ $labels.instance }} down
                    +
                    +
                    +

                    The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                    +

                    The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                    +

                    The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                    +

                    annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                    +
                    +
                    +

                    Alertmanager

                    +

                    The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                    +

                    The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                    +
                      +
                    • Routes: Represent a routing tree, the most specific rule, wins

                    • +
                    • Inhibition: Mute an alert, based on another alert

                    • +
                    • Receiver: Send a notification via email, sluck, etc’

                    • +
                    +

                    Check the Alertmanager documentation for details on how to specify a specific receiver.

                    +

                    In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                    +
                    +
                    +

                    Tips When Adding an Alert

                    +

                    It’s worse having an alert that does not work, than not having an alert at all

                    +

                    There are multiple ways you can use to make sure your alert is set correctly:

                    +
                      +
                    • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                    • +
                    • Force the alert to be active by reducing the limits or the duration.

                    • +
                    • When possible simulate the actual scenario and see that the alert works as expected.

                    • +
                    +

                    For example, low available disk space.

                    +

                    Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                    +

                    Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                    +

                    Starting with a simple working expression helps you bisect problems.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/procedures/alerts/index.html b/branch-4.0/procedures/alerts/index.html new file mode 100644 index 000000000..12e8d8e48 --- /dev/null +++ b/branch-4.0/procedures/alerts/index.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Alert Manager

                    +
                    +
                    +

                    Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/procedures/index.html b/branch-4.0/procedures/index.html new file mode 100644 index 000000000..bc8037d95 --- /dev/null +++ b/branch-4.0/procedures/index.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Procedures

                    +
                    +
                    +

                    There are several reference guides available which give additional information. Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/procedures/updating_dashboard.html b/branch-4.0/procedures/updating_dashboard.html new file mode 100644 index 000000000..5a7e7cea2 --- /dev/null +++ b/branch-4.0/procedures/updating_dashboard.html @@ -0,0 +1,950 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Adding and Modifying Dashboards

                    +

                    This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                    +

                    It covers dashboard templates and how to modify them.

                    + +
                    +

                    General Limitations

                    +

                    Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                    +
                    +

                    Consistency Between Restarts

                    +

                    By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                    +
                    +
                    +

                    Consistency Between Upgrades

                    +

                    As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                    +
                    +

                    Note

                    +

                     You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                    +
                    +

                    At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                    +
                    +
                    +
                    +

                    Using Templated Dashboards

                    +

                    Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                    +

                    Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                    +

                    For example a typical graph panel would look like this:

                    +
                    {
                    +    "aliasColors": {},
                    +    "bars": false,
                    +    "datasource": "prometheus",
                    +    "editable": true,
                    +    "error": false,
                    +    "fill": 0,
                    +    "grid": {
                    +        "threshold1": null,
                    +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                    +        "threshold2": null,
                    +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                    +    },
                    +    "gridPos": {
                    +        "h": 6,
                    +        "w": 10,
                    +        "x": 0,
                    +        "y": 4
                    +    },
                    +    "id": 2,
                    +    "isNew": true,
                    +    "legend": {
                    +        "avg": false,
                    +        "current": false,
                    +        "max": false,
                    +        "min": false,
                    +        "show": false,
                    +        "total": false,
                    +        "values": false
                    +    },
                    +    "lines": true,
                    +    "linewidth": 2,
                    +    "links": [],
                    +    "nullPointMode": "connected",
                    +    "percentage": false,
                    +    "pointradius": 5,
                    +    "points": false,
                    +    "renderer": "flot",
                    +    "seriesOverrides": [
                    +        {}
                    +    ],
                    +    "span": 5,
                    +    "stack": false,
                    +    "steppedLine": false,
                    +    "targets": [
                    +        {
                    +            "expr": "sum(node_filesystem_avail) by (instance)",
                    +            "intervalFactor": 1,
                    +            "legendFormat": "",
                    +            "refId": "A",
                    +            "step": 1
                    +        }
                    +    ],
                    +    "timeFrom": null,
                    +    "timeShift": null,
                    +    "title": "Available Disk Size",
                    +    "tooltip": {
                    +        "msResolution": false,
                    +        "shared": true,
                    +        "sort": 0,
                    +        "value_type": "cumulative"
                    +    },
                    +    "transparent": false,
                    +    "type": "graph",
                    +    "xaxis": {
                    +        "show": true
                    +    },
                    +    "yaxes": [
                    +        {
                    +            "format": "percent",
                    +            "logBase": 1,
                    +            "max": 101,
                    +            "min": 0,
                    +            "show": true
                    +        },
                    +        {
                    +            "format": "short",
                    +            "logBase": 1,
                    +            "max": null,
                    +            "min": null,
                    +            "show": true
                    +        }
                    +    ]
                    +}
                    +
                    +
                    +

                    As you can imagine, most panels would have similar values.

                    +

                    To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                    +
                    +

                    The Template Class System

                    +

                    The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                    +

                    The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                    +

                    In the template file, you can also add or override attributes.

                    +

                    The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                    +

                    When generating dashboards, each class will be replaced by its definition.

                    +

                    For example, a row in the type.json is defined as:

                    +
                    {
                    + "base_row": {
                    +     "collapse": false,
                    +     "editable": true
                    + },
                    + "row": {
                    +     "class": "base_row",
                    +     "height": "250px"
                    + }
                    + }
                    +
                    +
                    +

                    Will be used like in a template:

                    +
                    {
                    +     "class": "row",
                    +     "height": "150px",
                    +     "panels": [
                    +     ]
                    +}
                    +
                    +
                    +

                    And the output will be:

                    +
                    {
                    +     "class": "row",
                    +     "collapse": false,
                    +     "editable": true,
                    +     "height": "150px",
                    +     "panels": [
                    +
                    +     ]
                    +}
                    +
                    +
                    +

                    We can see that the template added the panels attribute and that it overrides the height attribute.

                    +
                    +
                    +

                    Panel Example

                    +

                    Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                    +
                    {
                    +     "class": "row",
                    +     "panels": [
                    +         {
                    +             "class": "bytes_panel",
                    +             "span": 3,
                    +             "targets": [
                    +                 {
                    +                     "expr": "sum(node_filesystem_avail) by (instance)",
                    +                     "intervalFactor": 1,
                    +                     "legendFormat": "",
                    +                     "metric": "",
                    +                     "refId": "A",
                    +                     "step": 1
                    +                 }
                    +             ],
                    +             "title": "Available Disk Size"
                    +         }
                    +     ]
                    +}
                    +
                    +
                    +

                    In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                    +

                    You can also see that the span attribute is overridden to set the panel size.

                    +

                    To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                    +
                    +
                    +

                    Grafana Formats and Layouts

                    +

                    The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                    +

                    Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                    +

                    The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                    +

                    To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                    +

                    The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                    +

                    You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                    +

                    gridPos has the following attributes:

                    +
                    {
                    +   "x": 0,
                    +   "y": 0,
                    +   "w": 24,
                    +   "h": 4
                    + }
                    +
                    +
                    +

                    When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                    +
                    {
                    +   "gridPos": {
                    +      "h": 2
                    +    }
                    +}
                    +
                    +
                    +
                    +
                    +

                    Generating the dashboards from templates (generate-dashboards.sh)

                    +
                    +

                    Prerequisite

                    +

                    Python 2.7

                    +

                    make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                    +

                    Use the -h flag to get help information.

                    +

                    You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                    +

                    When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                    +

                    For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                    +

                    .\generate-dashboards.sh -v 2020.1

                    +
                    +

                    Note

                    +

                    generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                    +
                    +
                    +
                    +
                    +

                    Validation

                    +

                    After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                    +

                    Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/reference/index.html b/branch-4.0/reference/index.html new file mode 100644 index 000000000..852b31ee4 --- /dev/null +++ b/branch-4.0/reference/index.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Reference Guide

                    +
                    +
                    +

                    There are several reference guides available which give additional information. Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/reference/matrix.html b/branch-4.0/reference/matrix.html new file mode 100644 index 000000000..0e6715b62 --- /dev/null +++ b/branch-4.0/reference/matrix.html @@ -0,0 +1,804 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Support Matrix

                    +

                    The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                    Scylla Monitoring Stack Version

                    Scylla Open Source Version

                    Scylla Enterprise Version

                    Node_exporter[1] Version

                    Scylla Manager Version

                    4.0

                    4.3, 4.4, 4.5, 4.6, 5.0

                    2020.1, 2021.1, 2022.2

                    0.17

                    2.3, 2.4, 2.5, 2.6, 3.0

                    3.11

                    4.3, 4.4, 4.5, 4.6, 5.0

                    2020.1, 2021.1, 2022.2

                    0.17

                    2.3, 2.4, 2.5, 2.6

                    3.10

                    4.3, 4.4, 4.5, 4.6

                    2020.1, 2021.1

                    0.17

                    2.3, 2.4, 2.5, 2.6

                    3.9

                    4.3, 4.4, 4.5, 4.6

                    2020.1, 2021.1

                    0.17

                    2.3, 2.4, 2.5

                    3.8

                    4.3, 4.4, 4.5

                    2020.1, 2021.1

                    0.17

                    2.3, 2.4, 2.5

                    3.7

                    4.2, 4.3, 4.4

                    2019.1, 2020.1, 2021.1

                    0.17

                    2.2, 2.3

                    3.6.3

                    4.2, 4.3, 4.4

                    2019.1, 2020.1, 2021.1

                    0.17

                    2.2, 2.3, 2.1

                    3.6

                    4.1, 4.2, 4.3

                    2019.1, 2020.1

                    0.17

                    2.1, 2.2, 2.3

                    3.6.1

                    4.1, 4.2, 4.3

                    2019.1, 2020.1

                    0.17

                    2.1, 2.2

                    3.6.1

                    4.1, 4.2, 4.3, 4.4

                    2019.1, 2020.1

                    0.17

                    2.1, 2.2

                    3.5

                    3.3, 4.0, 4.1, 4.2

                    2019.1, 2020.1

                    0.17

                    2.0, 2.1, 2.2

                    3.4.3

                    3.3, 4.0, 4.1, 4.2

                    2019.1, 2020.1

                    0.17

                    2.0, 2.1

                    3.4

                    3.3, 4.0, 4.1

                    2018.1, 2019.1

                    0.17

                    2.0, 2.1

                    3.3

                    3.1, 3.2, 3.3, 4.0

                    2018.1, 2019.1

                    0.17

                    1.4, 2.0, 2.1

                    3.2

                    3.1, 3.2, 3.3

                    2018.1, 2019.1

                    0.17

                    1.4, 2.0

                    3.1

                    2.3, 3.0, 3.1, 3.2

                    2018.1, 2019.1

                    0.17

                    1.3, 1.4, 2.0

                    3.0

                    2.3, 3.0, 3.1, 3.2

                    2018.1, 2019.1

                    0.17

                    1.3, 1.4

                    2.4

                    2.3, 3.0, 3.1

                    2018.1, 2019.1

                    0.14, 0.17

                    1.3, 1.4

                    2.3

                    2.3, 3.0

                    2018.1, 2019.1

                    0.14, 0.17

                    1.3

                    2.2

                    2.3, 3.0

                    2018.1, 2019.1

                    0.14, 0.17

                    1.3

                    2.1

                    2.3, 3.0

                    2018.1

                    0.14, 0.17

                    1.3

                    +

                    [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/reference/monitoring_apis.html b/branch-4.0/reference/monitoring_apis.html new file mode 100644 index 000000000..f10f3d58a --- /dev/null +++ b/branch-4.0/reference/monitoring_apis.html @@ -0,0 +1,677 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Interfaces

                    +

                    Scylla exposes two interfaces for online monitoring, as described below

                    +
                    +

                    Prometheus

                    +

                    By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                    +

                    For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                    +

                    You can change the Prometheus listening address and port in scylla.yaml file

                    +
                    # prometheus port
                    +# By default, Scylla opens prometheus API port on port 9180
                    +# setting the port to 0 will disable the prometheus API.
                    +prometheus_port: 9180
                    +#
                    +# prometheus address
                    +# By default, Scylla binds all interfaces to the prometheus API
                    +# It is possible to restrict the listening address to a specific one
                    +prometheus_address: 0.0.0.0
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/robots.txt b/branch-4.0/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.0/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.0/search.html b/branch-4.0/search.html new file mode 100644 index 000000000..2824a325b --- /dev/null +++ b/branch-4.0/search.html @@ -0,0 +1,635 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + + + +
                    + + + + + +
                    + + +
                    + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/searchindex.js b/branch-4.0/searchindex.js new file mode 100644 index 000000000..8236f7b49 --- /dev/null +++ b/branch-4.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "Scylla Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "Scylla Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41], "scylla": [0, 2, 4, 7, 10, 13, 25, 26, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40], "monitor": [0, 2, 4, 7, 10, 13, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40], "stack": [0, 2, 4, 7, 10, 13, 21, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 39, 40], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 18, 20, 22, 25, 26, 27, 28, 31, 32, 33, 34, 36, 38, 39, 40], "full": [0, 1, 3, 6, 9, 10, 25], "alert": [0, 1, 3, 5, 6, 9, 12], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 15, 18, 20, 22, 34, 36, 38], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 13, 20, 28, 32, 38, 40], "open": [0, 1, 3, 5, 6, 9, 15, 16, 19, 24], "sourc": [0, 1, 3, 5, 6, 9, 10, 15, 19, 20, 38], "tool": [0, 1, 3, 9, 18, 40], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 13, 15, 18, 21, 22, 23, 24, 40], "grafana": [0, 1, 3, 8, 9, 10, 21, 23, 24], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 12, 15, 18, 21, 22, 23, 24, 33, 40, 41], "consist": [1, 9, 10, 20, 33], "three": [1, 6, 10, 24], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 18, 20, 24], "collect": [1, 5, 6, 7, 8, 9, 22, 24, 34, 36], "store": [1, 5, 8, 9, 13, 21, 23, 24, 26, 27, 38], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 13, 15, 20, 21, 22, 23, 40], "alertmanag": [1, 2, 7, 9, 21, 23, 24], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 16, 20, 25, 40], "choos": [1, 3, 9, 11, 12, 14, 17, 18, 41], "topic": [1, 3, 9, 11, 12, 14, 17, 41], "get": [1, 6, 8, 9, 10, 13, 24, 26, 33, 37, 38, 39, 40], "start": [1, 3, 5, 8, 9, 10, 13, 20, 21, 22, 23, 32], "user": [1, 2, 6, 7, 9, 25, 40], "guid": [1, 6, 9, 12, 18, 19], "download": [1, 5, 6, 9, 20, 21, 22, 23, 24], "instal": [1, 2, 9, 18], "procedur": [1, 5, 6, 9, 18, 19], "troubleshoot": [1, 9, 31], "refer": [1, 6, 9, 12], "upgrad": [1, 12], "lesson": [1, 9, 27, 28], "univers": [1, 9], "github": [1, 5, 6, 21, 23, 24], "project": 1, "For": [1, 2, 4, 5, 6, 7, 9, 10, 13, 16, 18, 20, 24, 33, 34, 37, 40], "older": [1, 9, 22, 23, 24], "version": [1, 2, 5, 7, 9, 13, 15, 18], "document": [1, 5, 6, 8, 9, 10, 13, 18, 20, 21, 22, 23, 24], "see": [1, 2, 4, 5, 6, 9, 10, 13, 16, 18, 20, 21, 22, 23, 24, 32, 40], "here": [1, 5, 6, 7, 9, 10, 20], "base": [2, 5, 6, 7, 8, 9, 10, 13, 24, 25, 40], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 20, 21, 22, 23, 24, 28, 30, 32, 33, 39, 40, 41], "can": [2, 5, 6, 7, 8, 10, 13, 16, 18, 20, 21, 22, 23, 24, 25, 28, 32, 33, 40, 41], "all": [2, 3, 5, 6, 8, 10, 13, 16, 18, 20, 22, 25, 29, 33, 40], "sh": [2, 3, 6, 18, 20, 21, 22, 23, 24], "kill": [2, 6, 18, 20, 22], "script": [2, 3, 6, 7, 13, 22], "an": [2, 4, 5, 7, 8, 9, 13, 18, 20, 22, 24, 30, 31, 33, 34, 36, 38, 40], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 13, 16, 20, 24], "requir": [2, 8, 26, 29, 34, 40], "more": [2, 4, 5, 6, 10, 13, 16, 18, 25, 28, 31, 32, 34, 37, 40], "manual": [2, 18], "step": [2, 5, 8, 13, 18, 20, 21, 22, 23, 24], "onc": [2, 20, 24, 30, 38, 40], "configur": [2, 7, 10, 13, 16, 18, 20, 32, 33], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 20, 21, 22, 23, 24, 32, 33, 34, 35, 38, 39, 40, 41], "two": [2, 6, 7, 8, 13, 16, 20, 23, 24, 33, 38, 40], "wai": [2, 5, 7, 10, 18, 24, 31, 40], "launch": 2, "should": [2, 4, 5, 6, 8, 13, 18, 20, 22, 23, 24, 25, 26, 29, 30, 31, 37, 40], "one": [2, 6, 7, 16, 20, 21, 22, 23, 24, 26, 28, 29, 32, 33, 34, 40], "both": [2, 5, 6, 18, 21, 23, 24, 40], "In": [2, 6, 10, 13, 18, 20, 24, 32, 40], "particular": 2, "creat": [2, 5, 6, 7, 10, 13, 18, 25, 38, 40], "updat": [2, 5, 13, 18, 20], "yml": [2, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 24, 32, 40], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 13, 18, 20, 21, 23, 24, 27, 32, 33, 34, 39, 40], "make": [2, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 24, 33, 40], "sure": [2, 5, 6, 8, 10, 13, 18, 20, 21, 22, 23, 24, 40], "have": [2, 4, 5, 6, 7, 8, 10, 13, 18, 23, 24], "among": [2, 33], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 16, 18, 20, 21, 23, 24], "address": [2, 5, 6, 7, 8, 16, 18, 20], "either": [2, 6], "locat": [2, 7, 10, 20, 22, 33], "scylla_serv": [2, 5, 6, 18, 20, 21, 22, 23, 24, 40], "consul": [2, 7], "manag": [2, 5, 12, 15, 17], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 40], "exampl": [2, 4, 5, 6, 7, 8, 10, 18, 20, 21, 22, 23, 24, 33, 34, 40], "product": [2, 7], "system": [2, 7, 9, 10, 11, 21, 23, 24, 26, 32, 33, 40], "advis": [2, 33], "extern": [2, 5, 7, 8, 10, 13, 18, 21, 23, 24, 40], "directori": [2, 5, 7, 8, 10, 13, 20, 21, 22, 23, 24], "databas": [2, 5, 7, 20, 28, 40], "accordingli": 2, "below": [2, 5, 6, 10, 13, 16], "read": [2, 5, 6, 8, 9, 10, 18, 20, 25, 29, 32], "its": [2, 5, 6, 7, 8, 9, 13, 20], "from": [2, 5, 7, 8, 9, 10, 18, 20, 21, 22, 23, 24, 25, 31, 35, 40], "note": [2, 5, 6, 7, 18, 20, 21, 23, 24], "latter": 2, "tell": 2, "where": [2, 5, 6, 13, 18, 20, 24, 40], "themselv": [2, 13], "which": [2, 8, 12, 13, 14, 15, 31, 32, 34, 36, 38, 40], "differ": [2, 5, 6, 7, 8, 13, 20, 21, 22, 23, 24, 30, 31, 40], "run": [2, 3, 5, 6, 7, 8, 9, 13, 15, 18, 20, 22, 32, 39], "follow": [2, 4, 5, 6, 7, 13, 15, 18, 20, 21, 23, 24, 32, 40], "command": [2, 6, 8, 18, 20, 21, 23, 24, 32], "datasourc": [2, 5, 6, 8, 13], "under": [2, 5, 6, 24], "yaml": [2, 5, 6, 16], "To": [2, 4, 5, 6, 13, 16, 20, 21, 22, 23, 24], "sashboard": 2, "t": [2, 13, 24], "line": [2, 5, 6, 7, 8, 13, 20, 24, 32], "flag": [2, 6, 7, 8, 13, 18, 20, 21, 23, 24], "v": [2, 6, 7, 8, 13, 18], "specifi": [2, 6, 7, 10, 13, 18, 20, 32], "enterpris": [2, 6, 13, 15], "2020": [2, 6, 13, 15], "1": [2, 5, 6, 7, 8, 13, 15, 19, 21, 23, 24], "thi": [2, 4, 5, 6, 7, 8, 10, 13, 18, 20, 21, 22, 23, 24, 25, 26, 29, 32, 33, 35, 39, 40], "your": [2, 5, 6, 7, 8, 10, 11, 13, 16, 18, 20, 21, 23, 24, 26, 27, 28, 40], "pass": [2, 6, 7, 20], "call": [2, 6, 7], "servic": [2, 5, 6, 7, 9, 18], "container_nam": 2, "aalert": 2, "imag": [2, 9, 18], "prom": [2, 8, 18], "v0": [2, 5], "21": 2, "port": [2, 5, 6, 7, 16, 18, 20, 21, 23, 24], "9093": [2, 5], "volum": [2, 4, 5, 6, 21, 23, 24], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 13, 24], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 13, 22, 32], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "scylladb": [2, 5, 6, 21, 23, 24, 28, 29, 31, 32, 34, 36, 37], "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 13], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 13, 15], "3": [2, 4, 5, 6, 13, 15, 19, 34], "5": [2, 5, 6, 13, 15, 18], "3000": [2, 5, 6, 21, 23, 24], "1000": [2, 32], "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 13, 27, 34, 36, 40], "path": [2, 5, 6, 7, 8, 10, 20, 21, 22, 23, 24], "dir": [2, 7, 8, 21, 23, 24], "loki": [2, 6, 9], "mnt": 2, "3100": [2, 5], "rule": [2, 5, 7, 10, 24, 30, 39], "conf": [2, 5, 6], "aprom": [2, 18, 24], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 18, 24], "d": [2, 5, 6, 7, 8, 20, 21, 22, 23, 24], "scylla_manager_serv": [2, 5, 6, 18, 20, 22, 23, 24], "node_exporter_serv": [2, 5, 6, 20, 21], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 18, 20, 24, 40], "down": [2, 10, 18, 20, 21, 23, 24, 26, 32, 34], "begin": [3, 11, 12, 14, 17, 41], "deploi": [3, 6], "without": [3, 6, 7, 13, 20, 24], "us": [3, 4, 7, 9, 10, 11, 18, 20, 21, 22, 23, 24, 28, 33, 34, 36, 38, 40], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 39], "least": [4, 5, 6, 24], "physic": [4, 5, 6], "core": [4, 5, 6, 24], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 21, 23, 24, 32, 34, 38], "storag": [4, 5, 6, 7, 9, 13, 24], "retent": [4, 5, 6, 20, 24], "period": [4, 5, 6, 8, 10, 20, 32, 38], "section": [4, 5, 6, 18, 20, 23, 24, 40], "network": [4, 5, 6, 7, 18], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 18], "perform": [4, 5, 6, 24, 32, 33, 37, 40], "block": [4, 5, 6, 24], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 24, 28, 34, 36, 40], "default": [4, 5, 6, 7, 10, 13, 16, 18, 20, 22, 24, 29, 40], "15": [4, 5, 6, 20, 24], "dai": [4, 5, 6, 7, 20, 24], "around": [4, 5, 6, 18], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 40], "assum": [4, 5, 6, 7, 8, 10, 21, 23, 24], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 37], "6": [4, 5, 6, 13, 15], "node": [4, 5, 7, 15, 18, 20, 26, 27, 28, 33, 34, 36, 37, 40], "cluster": [4, 5, 6, 24, 31, 40], "each": [4, 5, 7, 8, 9, 10, 13, 15, 18, 26, 28, 33, 38, 40], "16": [4, 5, 6, 18], "so": [4, 5, 6, 7, 8, 10, 13, 18, 20, 24, 28, 40], "total": [4, 5, 6, 8, 13, 24], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 20, 22, 30, 38, 40], "need": [4, 5, 6, 7, 8, 13, 18, 24, 26, 27, 28, 39, 40], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 13, 18, 35, 39, 40], "replac": [4, 5, 6, 8, 13, 21, 23, 24], "ad": [4, 5, 6, 7, 12], "we": [4, 5, 6, 8, 9, 13, 21, 23, 24, 40], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 13, 18, 20, 24, 26, 32, 40], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 13, 18, 38, 40], "fast": [4, 5, 6, 39], "enough": [4, 5, 6, 39], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 13, 18, 20, 24, 26, 33, 40], "out": [4, 5, 6, 8, 39], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 33, 34, 36], "over": [4, 5, 6, 24], "longer": [4, 5, 6, 13, 20, 22, 24], "durat": [4, 5, 6, 10, 24], "e": [4, 5, 6, 13, 24], "g": [4, 5, 6, 7, 20, 21, 23, 24], "look": [4, 5, 6, 8, 10, 13, 24, 40], "week": [4, 5, 6, 7, 24], "view": [4, 5], "would": [4, 5, 6, 8, 10, 13, 20, 24, 25, 28, 40], "take": [4, 5, 6, 7, 13, 18, 20, 24], "than": [4, 5, 6, 10, 13, 20, 24, 40], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 24, 33], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 18, 22, 34], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 13, 16, 20, 40], "swap": [4, 5, 6], "crash": [4, 5, 6], "instruct": [5, 6, 21, 23, 24], "help": [5, 7, 10, 13, 40], "pleas": [5, 18], "most": [5, 10, 13, 24, 33, 35, 40], "current": [5, 6, 7, 10, 13, 18, 21, 23, 24], "common": [5, 7, 40], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 18], "standalon": 5, "thei": [5, 7, 10, 13, 37, 38], "alreadi": [5, 21, 23, 24], "consolid": 5, "componen": 5, "suggest": [5, 13, 24], "those": [5, 24], "offici": 5, "also": [5, 6, 7, 8, 10, 13], "main": [5, 20, 38], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 26, 40], "data": [5, 7, 9, 10, 13, 20, 21, 22, 23, 25, 26, 27, 28, 33, 34, 36, 37, 39, 40], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 18], "befor": [5, 6, 10, 20, 21, 22, 23, 24, 26, 27, 34, 40], "support": [5, 6, 13, 14, 25, 31, 40], "want": [5, 6, 10, 21, 23, 24], "latest": [5, 6, 7, 21, 23, 24], "releas": [5, 20, 21, 22, 23, 24], "tightli": 5, "compat": [5, 13, 18, 20, 22], "matrix": [5, 14], "cento": [5, 18], "instanc": [5, 6, 10, 13, 24], "wget": [5, 6, 21, 23, 24], "http": [5, 6, 8, 18, 20, 21, 23, 24, 28, 29, 31, 37], "com": [5, 6, 21, 23, 24, 28, 29, 31, 37], "archiv": [5, 6, 21, 23, 24], "ref": 5, "tag": 5, "tar": [5, 6, 21, 23, 24], "gz": [5, 6], "xvf": [5, 6], "test": [5, 18, 21, 40], "22": [5, 13], "linux": 5, "amd64": 5, "copi": [5, 20, 21, 22, 23], "file": [5, 7, 8, 10, 13, 16, 20, 22, 32], "cp": [5, 21, 22, 23, 24], "p": [5, 7, 8, 18, 20, 21, 23, 24], "home": 5, "cd": [5, 6, 21, 23, 24], "verifi": [5, 22], "point": [5, 6, 13, 21, 23, 24], "browser": [5, 6, 8, 13, 18, 21, 23, 24], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 18, 24], "aggreg": 5, "inspir": 5, "central": [5, 9], "check": [5, 10, 18, 21, 23, 24, 35, 36, 40], "recomand": 5, "local": [5, 6, 7, 8, 9, 13, 18, 21, 23, 24, 40], "describ": [5, 6, 8, 16, 18, 40], "respons": [5, 10], "pars": [5, 9, 13, 30, 40], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 34, 36], "load": [5, 6, 18, 24, 25, 28, 29, 40], "multipl": [5, 6, 7, 8, 9, 10, 13, 26, 29, 30, 37, 39, 40], "do": [5, 6, 7, 13, 18, 20, 21, 22, 23, 24, 28, 32, 40], "rsyslog": [5, 9], "second": [5, 6, 10, 18, 20, 21, 23], "relat": [5, 40], "modifi": [5, 12], "mkdir": 5, "templat": [5, 6, 8, 18, 20, 40], "edit": [5, 6, 7, 8, 13, 18], "localhost": [5, 7, 24], "loki_ip": 5, "": [5, 6, 7, 9, 10, 13, 25, 26, 35, 38, 40], "27": [5, 6, 13], "If": [5, 6, 7, 8, 13, 18, 20, 22, 24, 32, 35, 37, 38, 39, 40], "besid": [5, 7, 20, 40], "expect": [5, 10, 21, 23, 24], "scrap": 5, "job": [5, 6, 18], "onli": [5, 6, 7, 20, 22, 24, 28, 30, 32, 38, 40], "import": [5, 6, 7, 20, 21, 23, 24, 32], "record": [5, 24], "asspect": 5, "work": [5, 6, 7, 8, 10, 13, 20, 21, 23, 24], "code": [5, 33], "shell": 5, "prom_rul": [5, 24], "correct": [5, 22], "static": [5, 32], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 20, 31], "host": [5, 6, 7, 9, 18], "static_config": [5, 6], "target": [5, 7, 13, 16, 18, 20, 22], "127": [5, 7, 18], "right": [5, 6, 13, 33, 40], "typic": [5, 13, 24, 26, 28, 38, 40], "node_export": [5, 6, 7, 9, 15, 18], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 13, 16, 20, 22, 29, 40], "everi": [5, 6, 7, 24], "scrape_timeout": 5, "timeout": [5, 39], "try": [5, 18], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 24], "ani": [5, 6, 10, 13, 18, 33, 40], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 20], "scrape_config": [5, 20], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 16, 18], "There": [5, 6, 8, 10, 12, 13, 14, 24, 37, 39, 41], "instead": [5, 6, 8, 24, 40], "found": [5, 6, 7, 10, 13], "must": [5, 6, 34], "even": [5, 6, 7], "center": [5, 6, 8, 40], "cat": 5, "list": [5, 6], "end": [5, 6, 20, 40], "66": [5, 18], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 24], "dc1": [5, 6], "172": [5, 6, 18], "17": [5, 6, 15, 18, 22], "dc2": [5, 6], "previou": [5, 23, 24], "deprec": 5, "5090": [5, 6, 18], "tsdb": [5, 7, 8, 24], "accumul": 5, "consol": [5, 18], "visibl": 5, "execut": [5, 25, 30], "through": 5, "node_memory_memfre": 5, "And": [5, 13, 21, 23], "scylla_reactor_util": 5, "At": [5, 13, 23, 24], "emit": 5, "abl": [5, 8, 20, 22, 24], "them": [5, 7, 9, 10, 13, 22, 33], "grafna": 5, "depend": [5, 8, 24], "repositori": [5, 6], "yum": 5, "zip": [5, 21, 23, 24], "structur": 5, "rest": [5, 8, 24], "access": [5, 7], "sudo": [5, 6, 18], "r": [5, 7, 13, 18], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 13, 18], "provis": [5, 6, 13], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 13, 26, 27, 34, 38, 40], "folder": 5, "name": [5, 6, 8, 10, 18, 22, 40], "otherwis": 5, "some": [5, 8, 10, 24, 33, 37], "tabl": [5, 6, 10, 15, 25, 33, 40], "apivers": 5, "type": [5, 13, 40], "url": [5, 8, 20, 24], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 33, 41], "connect": [5, 8, 13, 16, 18], "between": [5, 8, 18, 20, 21, 23, 24, 32, 33, 40], "give": [5, 12, 14], "strongli": 5, "encourag": 5, "restrict": [5, 16], "keyspac": [5, 6], "part": [5, 6, 10, 22, 25, 28, 33, 40], "option": [5, 6, 8, 9, 18, 20, 24, 32], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 13, 20], "detail": [5, 10, 32, 33], "done": [5, 6, 7, 13, 18, 24], "first": [5, 21, 23, 24, 40], "new": [5, 6, 18, 38], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 40], "AND": 5, "login": [5, 6, 18], "proper": [5, 18], "select": [5, 33, 40], "permiss": [5, 6, 20], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 13, 30, 32], "mention": [5, 13], "previous": [5, 23, 24], "safer": [5, 40], "dedic": [5, 6], "limit": [5, 6, 8, 10, 29, 32, 40], "privileg": [5, 7, 24], "un": [5, 24], "comment": 5, "relev": [5, 7, 24, 33], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 18], "evalu": [6, 24], "laptop": 6, "34": 6, "8": [6, 15, 20, 24], "11": [6, 15], "32": 6, "10": [6, 10, 13, 15], "9": [6, 15, 24], "29": 6, "25": [6, 18], "avoid": [6, 13, 18, 29, 31, 40], "root": [6, 18, 21, 23, 24], "go": [6, 18], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 21, 23, 24], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 18, 20], "extract": 6, "binari": [6, 18], "clone": 6, "git": 6, "directli": [6, 9], "checkout": 6, "restart": [6, 7, 8, 20], "know": [6, 18, 28, 40], "higher": [6, 24, 28, 40], "wish": [6, 7], "match": [6, 40], "datacent": 6, "nodetool": 6, "statu": [6, 18, 24], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 20], "listen": [6, 7, 16, 20], "set": [6, 7, 10, 13, 16, 32], "inform": [6, 7, 12, 13, 14, 16, 24, 25, 26, 27], "agent": [6, 7, 8, 9, 15, 18], "machin": [6, 7, 18, 22], "overrid": [6, 7, 13], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 13], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 18, 21, 23, 24], "within": [6, 10, 13], "protect": 6, "assign": 6, "place": [6, 7, 8, 13, 40], "outsid": [6, 7, 20], "result": [6, 7, 20, 26, 28, 29, 32, 38, 40], "lost": [6, 7, 13, 40], "exist": [6, 13, 40], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 32, 40], "firewal": [6, 18], "7000": [6, 18], "myservic": 6, "m": [6, 7, 20, 21, 23, 24], "2019": [6, 15, 37], "reach": [6, 8, 28, 32, 34, 40], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 28, 29, 34, 36, 40], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 13, 18], "authent": [6, 7], "disabl": [6, 16], "simplest": 7, "small": [7, 38], "util": [7, 13, 22, 24], "appropri": 7, "h": [7, 13], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 24, 34, 39], "map": 7, "bind": [7, 16], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 20, 24, 27, 30, 33], "addit": [7, 8, 9, 10, 12, 14, 24, 40], "specif": [7, 10, 16, 18, 35, 40], "driver": [7, 28, 29, 37, 40], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 18, 39], "gui": [7, 13, 18], "keep": [7, 20, 24], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 13, 24], "mean": [7, 13, 20, 25, 26, 27, 28, 29, 34, 36, 40], "chang": [7, 13, 16, 18, 20, 21, 22, 23, 24], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 13], "b": [7, 24], "o": [7, 15, 22, 33], "disk": [7, 10, 13, 18, 25, 27, 33], "possibl": [7, 10, 16, 31, 40], "api": [7, 8, 16, 20], "resolv": 7, "explicitli": [7, 13], "request": [7, 16, 33, 39], "how": [7, 8, 10, 13, 21, 23, 24, 26, 27, 28, 33, 40], "someth": [7, 10, 11, 13, 24, 38], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 13], "horizont": 8, "scale": [8, 39], "backup": 8, "benefit": [8, 40], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 21, 23, 24], "reason": [8, 13, 18, 24, 36, 40], "why": 8, "million": 8, "singl": [8, 13, 33], "capac": 8, "sometim": 8, "traffic": [8, 18, 37, 40], "reachabl": [8, 20], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 13, 20, 21, 23, 24, 27], "expos": [8, 16, 20], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 33], "10903": 8, "10904": 8, "replica": [8, 26, 27, 28, 33, 34, 40], "abov": [8, 21, 23, 24], "last": [8, 24], "db_address": 8, "could": [8, 33, 37, 39, 40], "long": [8, 10, 24, 38], "now": [8, 10, 24], "grafan": 9, "render": [9, 13], "sidecar": 9, "receiv": [9, 10, 40], "distribut": [9, 28, 37, 40], "email": [9, 10], "slack": [9, 10], "displai": [9, 22], "enhanc": [10, 11], "notifi": [10, 11, 33], "wrong": [10, 11, 13, 18, 24, 38, 40], "shown": [10, 18, 21, 23, 24], "overview": [10, 24, 33], "condit": 10, "met": 10, "certain": 10, "defin": [10, 13, 20, 31, 40], "what": [10, 24], "happen": [10, 18], "report": [10, 15, 18, 40], "let": [10, 20], "u": 10, "instancedown": 10, "expr": [10, 13, 24], "60": [10, 24], "sever": [10, 12, 14, 41], "annot": 10, "descript": [10, 33], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 13, 21], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 40], "rout": [10, 28, 40], "repres": 10, "tree": 10, "win": [10, 18], "inhibit": 10, "mute": 10, "via": [10, 18], "sluck": 10, "wors": 10, "correctli": [10, 13, 20, 22], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 22, 24], "reduc": [10, 13, 26], "simul": 10, "actual": [10, 36], "low": [10, 40], "space": 10, "lower": [10, 40], "fire": 10, "show": [10, 13, 15, 24, 40], "propag": 10, "valu": [10, 13, 30, 32, 38, 40], "similar": [10, 13], "free": 10, "big": [10, 40], "bisect": 10, "problem": [10, 33, 39, 40], "explain": [13, 21, 23, 24, 33], "intern": [13, 28, 40], "potenti": [13, 33, 40], "issu": [13, 33, 37, 40], "whenev": 13, "save": 13, "earlier": 13, "overridden": 13, "perman": 13, "eventu": 13, "made": 13, "larg": [13, 33], "maintain": 13, "json": 13, "too": [13, 32, 38], "verbos": 13, "element": [13, 33], "object": 13, "attribut": 13, "graph": [13, 20, 22, 24, 40], "aliascolor": 13, "bar": 13, "error": [13, 24, 33, 34, 36], "fill": [13, 39], "grid": 13, "threshold1": 13, "null": 13, "threshold1color": 13, "rgba": 13, "216": 13, "200": 13, "threshold2": 13, "threshold2color": 13, "234": 13, "112": 13, "gridpo": 13, "w": [13, 18], "x": [13, 18, 19], "y": [13, 19], "id": [13, 18], "isnew": 13, "legend": 13, "avg": 13, "max": 13, "min": 13, "linewidth": 13, "link": [13, 33], "nullpointmod": 13, "percentag": [13, 40], "pointradiu": 13, "flot": 13, "seriesoverrid": 13, "span": 13, "steppedlin": 13, "sum": [13, 24], "node_filesystem_avail": 13, "intervalfactor": 13, "legendformat": 13, "refid": 13, "timefrom": 13, "timeshift": 13, "titl": 13, "size": [13, 29, 40], "tooltip": 13, "msresolut": 13, "share": [13, 32], "sort": [13, 31, 40], "value_typ": 13, "cumul": 13, "transpar": 13, "xaxi": 13, "yax": 13, "percent": 13, "logbas": 13, "101": 13, "short": 13, "imagin": 13, "redund": 13, "resembl": 13, "css": 13, "hierarch": 13, "definit": [13, 20, 40], "inherit": 13, "row": [13, 31, 40], "base_row": 13, "collaps": 13, "height": 13, "250px": 13, "Will": 13, "150px": 13, "output": 13, "consid": 13, "bytes_panel": 13, "byte": 13, "unit": 13, "axi": 13, "adjust": 13, "readabl": 13, "gb": 13, "mb": 13, "grasp": 13, "origin": [13, 24, 35], "12": [13, 18, 24], "wa": [13, 40], "larger": 13, "break": [13, 29, 40], "later": 13, "were": [13, 20, 40], "absolut": 13, "posit": 13, "width": 13, "backward": [13, 18, 20, 22], "ve": 13, "had": 13, "imposs": 13, "hand": 13, "overcom": 13, "transit": [13, 22, 24], "calcul": [13, 24], "taken": [13, 20], "still": [13, 24], "unlik": 13, "partial": 13, "24": [13, 24], "don": [13, 24], "python": 13, "make_dashboard": 13, "revers": [13, 33], "usual": [13, 18, 33, 40], "easier": 13, "wrapper": 13, "re": [13, 28], "just": 13, "refresh": 13, "generate_gener": 13, "ran": 13, "mayb": 13, "interfac": [14, 18], "2021": 15, "2022": 15, "2018": [15, 29], "14": [15, 18], "onlin": 16, "prometheus_port": 16, "prometheus_address": 16, "integr": 17, "56090": 18, "old": [18, 21, 22, 23, 24], "howev": 18, "twice": 18, "easiest": 18, "remov": [18, 20], "scylla_manager1": 18, "messag": 18, "wait": [18, 34], "non": [18, 20, 27, 28, 33, 37, 40], "post": 18, "past": [18, 22], "mai": [18, 32, 33, 34, 40], "ownership": 18, "la": 18, "grep": 18, "drwxr": 18, "xr": 18, "4096": 18, "jun": 18, "51": 18, "chown": 18, "appear": 18, "unreach": [18, 34], "immedi": 18, "suspect": 18, "tab": 18, "rang": [18, 24, 40], "align": 18, "On": [18, 33], "41bd3db26240": 18, "entrypoin": 18, "ago": [18, 24], "23": 18, "7001": 18, "tcp": 18, "9042": 18, "9160": 18, "10000": 18, "click": 18, "usag": [18, 28, 40], "fetch": 18, "curl": 18, "scylla_nod": 18, "return": [18, 20, 25, 26, 27, 29, 34, 36, 40], "ef": 18, "gre": 18, "scylla_setup": 18, "9100": 18, "while": [18, 20, 21, 23, 24, 32], "captur": 18, "tshark": 18, "f": 18, "dst": 18, "eth0": 18, "toward": 18, "199": 18, "203": 18, "229": 18, "89": 18, "142": 18, "59212": 18, "ack": 18, "seq": 18, "317": 18, "78193": 18, "158080": 18, "len": 18, "tsval": 18, "79869679": 18, "tsecr": 18, "3347447210": 18, "74": 18, "60440": 18, "syn": 18, "29200": 18, "mss": 18, "1460": 18, "sack_perm": 18, "79988291": 18, "128": 18, "sinc": 20, "parallel": [20, 21, 23, 24], "migrat": [20, 21, 23], "lose": 20, "histor": [20, 24], "process": [20, 32, 39], "safe": 20, "page": [20, 22, 33], "unzip": [20, 21, 22, 23, 24], "3001": [20, 21, 23, 24], "9091": [20, 21, 23, 24], "9094": 20, "fail": [20, 26, 28, 33, 40], "loss": 20, "everyth": 20, "stop": [20, 21, 22, 23, 24], "format": [20, 24], "rule_fil": 20, "9111": 20, "phase": [20, 22], "serv": 20, "remote_read": 20, "v1": 20, "histori": [20, 22], "continu": [20, 21, 23, 24], "back": [20, 26], "recommend": [21, 23, 24], "uninstal": [21, 23, 24], "minor": [21, 23, 24], "9095": [21, 23, 24], "brows": [21, 23, 24], "satisfi": [21, 23, 24], "shut": [21, 23, 24], "caus": [21, 23, 24, 28, 40], "blackout": [21, 23, 24], "normal": [21, 23, 24], "dure": [21, 23, 24], "oper": [21, 23, 24, 33, 40], "complet": [21, 23, 24], "switch": [22, 24], "fulli": 22, "affect": 22, "helper": 22, "node_exporter_instal": 22, "ship": 22, "sub": 22, "color": 22, "simpli": 22, "side": [23, 24, 25, 33, 40], "newer": [23, 24], "ensur": 24, "patch": 24, "skip": 24, "entir": 24, "promethu": 24, "p99": 24, "write": [24, 27], "latenc": [24, 28, 32, 33, 40], "wlatencyp99": 24, "histogram_quantil": 24, "99": 24, "rate": [24, 40], "scylla_storage_proxy_coordinator_write_latency_bucket": 24, "shard": [24, 33], "scheduling_group_nam": 24, "le": 24, "fall": [24, 26], "mechan": [24, 26], "present": 24, "reli": [24, 40], "miss": 24, "year": 24, "month": 24, "360": 24, "our": 24, "nine": 24, "gap": 24, "minu": 24, "exact": 24, "goe": 24, "revert": 24, "stat": 24, "overlap": 24, "promtool": 24, "90": 24, "epoc": 24, "translat": 24, "mani": [24, 26, 27, 40], "echo": 24, "date": 24, "3600": 24, "exec": 24, "back_fil": 24, "took": 24, "hour": 24, "100": [24, 32, 39], "creation": 24, "inerupt": 24, "split": 24, "smaller": 24, "successfulli": 24, "compact": [24, 39], "half": 24, "primari": [25, 40], "kei": [25, 31, 40], "scan": 25, "These": [25, 40], "kind": [25, 40], "bigger": 25, "care": [25, 26, 27, 40], "replicationfactor": [26, 27], "piec": 26, "determin": [26, 27, 34, 40], "repli": [26, 27, 29, 34, 36, 40], "unavail": [26, 40], "client": [26, 29, 33, 40], "respond": 26, "accompani": 26, "deep": 26, "understand": 26, "acknowledg": 27, "coordin": [27, 28, 34, 36, 40], "hint": 27, "fact": 27, "yet": 27, "ideal": [28, 40], "resourc": [28, 31, 40], "replic": [28, 34, 36, 40], "prepar": [28, 33, 37], "statement": [28, 30, 33, 37], "balanc": [28, 32, 33, 40], "polici": 28, "cours": 28, "intro": 28, "recap": 28, "ring": [28, 40], "architectur": 28, "chunk": [29, 40], "increas": [29, 32, 40], "overal": [29, 32, 40], "thu": 29, "www": [29, 37], "07": 29, "13": 29, "effici": [29, 40], "optim": [30, 37, 41], "concret": 30, "thumb": 30, "alwai": 30, "favor": 30, "partit": [31, 33], "BY": [31, 40], "ineffici": [31, 40], "consum": 31, "doc": 31, "background": [32, 39], "much": [32, 40], "impact": [32, 33], "compaction_static_shar": 32, "50": 32, "indic": [32, 33, 38, 39, 40], "overli": 32, "slow": 32, "enforc": 32, "min_threshold": 32, "compaction_enforce_min_threshold": 32, "bucket": 32, "sstabl": 32, "stc": 32, "recogn": 33, "bad": 33, "practic": [33, 37], "solv": 33, "left": 33, "categori": [33, 40], "jump": 33, "warn": 33, "cell": 33, "model": [33, 37, 39, 40], "imbal": 33, "imbalanc": 33, "hot": 33, "bottleneck": [33, 37], "cach": 33, "hit": 33, "filter": 33, "token": 33, "awar": 33, "order": [33, 40], "due": 33, "unsatisfi": 33, "faulti": 33, "evict": 33, "answer": [34, 36], "aka": 34, "factor": 34, "quorum": [34, 40], "hardwar": [35, 39], "occur": 35, "leav": 36, "risk": 36, "identifi": [36, 40], "evenli": 37, "across": 37, "becom": 37, "explan": 37, "08": 37, "best": 37, "field": 38, "being": 38, "defi": 38, "purpos": 38, "might": 38, "shed": 39, "drop": [39, 40], "repair": 39, "que": 39, "upper": 40, "gaug": 40, "inspect": 40, "zero": 40, "mislead": 40, "panel": 40, "holder": 40, "prevent": 40, "inject": 40, "did": 40, "compound": 40, "column": 40, "ks1": 40, "table_demo": 40, "text": 40, "int": 40, "desc": 40, "cat1": 40, "asc": 40, "overhead": 40, "thing": 40, "major": 40, "success": 40, "hurt": 40, "cl": 40, "expens": 40, "term": 40, "cost": 40, "ONE": 40, "local_quorum": 40, "local_on": 40, "nearest": 40, "advisor": 41}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylla": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 27, 33, 41], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 33, 41], "stack": [1, 3, 5, 6, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 33, 41], "us": [2, 5, 6, 8, 13, 25, 26, 27, 31, 41], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 13], "set": [2, 5, 20, 21, 23, 24], "prometheu": [2, 4, 5, 6, 7, 8, 10, 16, 20], "grafana": [2, 5, 6, 7, 13, 18], "provis": 2, "data": [2, 6, 8, 18, 24], "sourc": [2, 8, 18], "file": [2, 6, 18, 21, 23, 24], "dashboard": [2, 6, 13], "load": 2, "start": [2, 6, 7, 18, 24], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 20, 21, 22, 23, 24], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 13, 20, 39], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 35], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 32], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 18], "configur": [5, 6, 8], "enabl": 5, "compat": 6, "matrix": [6, 15], "post": [6, 24, 29, 37], "node": [6, 35], "from": [6, 13], "manag": [6, 7, 11, 18], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 18], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": [6, 20, 21, 22, 23, 24], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 13, 21, 23, 24, 33, 40], "all": [7, 21, 23, 24, 26], "sh": [7, 13], "command": 7, "gener": [7, 13], "option": 7, "relat": [7, 20, 21, 22, 23, 24], "ldap": 7, "support": [7, 15], "retent": 7, "period": [7, 24], "alert": [7, 10, 11, 20], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 25, 26, 27, 28, 29, 30, 31, 37, 40], "updat": 8, "high": 9, "level": [9, 18, 26, 27, 34, 40], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 13], "procedur": [12, 20, 21, 22, 23, 24], "modifi": 13, "limit": 13, "consist": [13, 26, 27, 34, 40], "between": 13, "restart": [13, 24], "upgrad": [13, 18, 19, 20, 21, 22, 23, 24], "templat": 13, "class": 13, "panel": 13, "exampl": 13, "format": 13, "layout": 13, "valid": [13, 20, 21, 22, 23, 24], "refer": 14, "guid": [14, 17, 20, 21, 22, 23, 24], "interfac": 16, "troubleshoot": [17, 18], "problem": 18, "2": [18, 20, 21, 22], "duplic": 18, "inform": 18, "A": 18, "contain": [18, 21, 23, 24], "fail": [18, 34, 36], "To": 18, "And": 18, "permiss": 18, "No": 18, "point": 18, "solut": 18, "chart": 18, "show": 18, "error": [18, 35], "sign": 18, "server": [18, 21, 23, 24], "metric": [18, 24], "notic": 18, "open": 18, "3": [18, 20, 22, 23, 24], "0": 18, "enterpris": 18, "2019": 18, "1": [18, 20, 22], "work": 18, "wireshark": 18, "x": [20, 21, 22, 23, 24], "latest": 20, "new": [20, 21, 22, 23, 24], "rule": 20, "4": [20, 24], "move": [20, 21, 23, 24], "old": 20, "b": 20, "rollback": [20, 21, 22, 23, 24], "link": [20, 21, 22, 23, 24, 27, 28, 29, 31, 37], "y": [21, 23, 24], "": [21, 23, 24], "i": [21, 23, 24, 35], "run": [21, 23, 24], "correct": [21, 23, 24], "correctli": [21, 23], "kill": [21, 23, 24], "node_export": 22, "test": [23, 24], "mode": [23, 24], "second": 24, "migrat": 24, "backup": 24, "back": 24, "fill": 24, "determin": 24, "backfil": 24, "time": 24, "end": 24, "process": 24, "creat": 24, "copi": 24, "some": [25, 26, 27, 28, 29, 30, 31, 34, 36], "allow": [25, 40], "filter": [25, 40], "ani": 27, "univers": [27, 28], "ar": [28, 29, 30, 37], "token": [28, 40], "awar": [28, 40], "select": 29, "non": [29, 30], "page": [29, 40], "blog": [29, 37], "prepar": [30, 38, 40], "revers": [31, 40], "order": 31, "document": 31, "compact": 32, "take": 32, "lot": 32, "cpu": 32, "advisor": 33, "section": 33, "oper": [34, 36], "due": 34, "unsatisfi": 34, "o": 35, "can": 35, "indic": 35, "faulti": 35, "replica": 36, "side": 36, "cql": [37, 40], "balanc": 37, "among": 37, "shard": 37, "statement": [38, 40], "cach": 38, "evict": 38, "overload": 39, "optim": 40, "read": 40, "cross": 40, "dc": 40, "request": 40}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"CQL queries are not balanced among shards": [[37, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[37, "blog-post-link"]], "Some queries are non-prepared": [[30, "some-queries-are-non-prepared"]], "I/O Errors can indicate a node with a faulty disk": [[35, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some queries use reverse order": [[31, "some-queries-use-reverse-order"]], "Documentation link": [[31, "documentation-link"]], "Some operation failed due to unsatisfied consistency level": [[34, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Scylla Monitoring Stack Advisor": [[33, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[33, "the-advisor-section"]], "System Overload": [[39, "system-overload"]], "Compaction takes lots of memory and CPU": [[32, "compaction-takes-lots-of-memory-and-cpu"]], "Prepared statements cache eviction": [[38, "prepared-statements-cache-eviction"]], "Some operations failed on the replica side": [[36, "some-operations-failed-on-the-replica-side"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[20, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "Upgrade Procedure": [[20, "upgrade-procedure"], [24, "upgrade-procedure"], [21, "upgrade-procedure"], [23, "upgrade-procedure"], [22, "upgrade-procedure"]], "1. Upgrade to the latest 1.x version": [[20, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[20, "install-the-new-monitoring-stack"], [22, "install-the-new-monitoring-stack"]], "Validation": [[20, "validation"], [13, "validation"]], "3. Alerting Rules": [[20, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[20, "moving-to-prometheus-2-x"]], "a. Set the old system": [[20, "a-set-the-old-system"]], "b. Set the new system": [[20, "b-set-the-new-system"]], "Validate the upgrade": [[20, "validate-the-upgrade"], [22, "validate-the-upgrade"]], "Rollback": [[20, "rollback"], [22, "rollback"]], "Related Links": [[20, "related-links"], [24, "related-links"], [21, "related-links"], [23, "related-links"], [22, "related-links"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[24, "install-4-y-the-new-version"]], "Setting the server\u2019s files": [[24, "setting-the-server-s-files"], [21, "setting-the-server-s-files"], [23, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[24, "validate-the-new-version-is-running-the-correct-version"], [21, "validate-the-new-version-is-running-the-correct-version"], [23, "validate-the-new-version-is-running-the-correct-version"]], "Running in test mode": [[24, "running-in-test-mode"]], "Running second monitoring stack": [[24, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[24, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[24, "migrating"]], "Move to version 4.y (the new version)": [[24, "move-to-version-4-y-the-new-version"]], "Backup": [[24, "backup"]], "Kill all containers": [[24, "kill-all-containers"], [21, "kill-all-containers"], [23, "kill-all-containers"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [23, "rollback-to-version-3-x"]], "Post-installation: Metrics back-filling": [[24, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[24, "determine-the-backfilling-period"]], "Determine the start time": [[24, "determine-the-start-time"]], "Determine the end time": [[24, "determine-the-end-time"]], "Backfilling Process": [[24, "backfilling-process"]], "backup": [[24, "id1"]], "Restart the monitoring stack": [[24, "restart-the-monitoring-stack"]], "Create the data files": [[24, "create-the-data-files"]], "Copy the data files": [[24, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[21, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[21, "install-2-y-the-new-version"]], "Validate the version installed correctly": [[21, "validate-the-version-installed-correctly"], [23, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[21, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[21, "rollback-to-version-2-x"]], "Some queries are not token-aware": [[28, "some-queries-are-not-token-aware"]], "University link": [[28, "university-link"]], "Some queries use Consistency Level: ALL": [[26, "some-queries-use-consistency-level-all"]], "Some queries use ALLOW FILTERING": [[25, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[23, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[23, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[23, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[23, "move-to-version-3-y-the-new-version"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[22, "validate-node-exporter-version"]], "Some queries use Consistency Level: ANY": [[27, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[27, "link-to-scylla-university"]], "Some SELECT queries are non-paged": [[29, "some-select-queries-are-non-paged"]], "Blog-post Links": [[29, "blog-post-links"]], "Scylla Monitoring Stack Procedures": [[12, "scylla-monitoring-stack-procedures"]], "Adding and Modifying Dashboards": [[13, "adding-and-modifying-dashboards"]], "General Limitations": [[13, "general-limitations"]], "Consistency Between Restarts": [[13, "consistency-between-restarts"]], "Consistency Between Upgrades": [[13, "consistency-between-upgrades"]], "Using Templated Dashboards": [[13, "using-templated-dashboards"]], "The Template Class System": [[13, "the-template-class-system"]], "Panel Example": [[13, "panel-example"]], "Grafana Formats and Layouts": [[13, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[13, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[13, "prerequisite"], [2, "prerequisite"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[17, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Interfaces": [[16, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[16, "prometheus"]], "Scylla Monitoring Stack Reference Guide": [[14, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Troubleshoot Scylla Monitoring Stack": [[18, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[18, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[18, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[18, "a-container-fails-to-start"]], "Files And Directory Permissions": [[18, "files-and-directory-permissions"]], "No Data Points": [[18, "no-data-points"]], "Solution": [[18, "solution"], [18, "id1"], [18, "id2"], [18, "id3"]], "Grafana Chart Shows Error (!) Sign": [[18, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[18, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[18, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[18, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[18, "working-with-wireshark"]], "Upgrade Scylla Monitoring Stack": [[19, "upgrade-scylla-monitoring-stack"]], "Scylla Monitoring Stack Support Matrix": [[15, "scylla-monitoring-stack-support-matrix"]], "The CQL Optimization": [[40, "the-cql-optimization"]], "Prepared Statements": [[40, "prepared-statements"]], "Token Aware": [[40, "token-aware"]], "Paged Queries": [[40, "paged-queries"]], "Reversed CQL Reads": [[40, "reversed-cql-reads"]], "ALLOW FILTERING": [[40, "allow-filtering"]], "Consistency Level": [[40, "consistency-level"]], "Cross DC": [[40, "cross-dc"]], "Cross DC Consistency Level": [[40, "cross-dc-consistency-level"]], "Cross DC read requests": [[40, "cross-dc-read-requests"]], "Using Scylla Monitoring Stack": [[41, "using-scylla-monitoring-stack"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Minimal Production System Recommendations": [[6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Scylla Monitoring Stack": [[9, "scylla-monitoring-stack"], [1, "scylla-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.0/sitemap.xml b/branch-4.0/sitemap.xml new file mode 100644 index 000000000..a4bebfc59 --- /dev/null +++ b/branch-4.0/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.0/troubleshooting/index.html b/branch-4.0/troubleshooting/index.html new file mode 100644 index 000000000..29981cb67 --- /dev/null +++ b/branch-4.0/troubleshooting/index.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Troubleshooting Guide for Scylla Monitoring Stack

                    +
                    +
                    +

                    Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/troubleshooting/monitor_troubleshoot.html b/branch-4.0/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..8ecf5504e --- /dev/null +++ b/branch-4.0/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,853 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Troubleshoot Scylla Monitoring Stack

                    +

                    This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                    +
                    +

                    Problem

                    +
                    +

                    Scylla-Manager 2.2 with Duplicate information

                    +

                    Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                    +
                      +
                    • For Manager server: from 56090 to 5090

                    • +
                    • For Manager Agent: from 56090 to 5090

                    • +
                    +

                    For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                    +

                    However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                    +

                    The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                    +

                    Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                    +
                    +
                    +

                    A Container Fails To Start

                    +

                    When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                    +
                    Wait for Prometheus container to start........Error: Prometheus container failed to start
                    +
                    +
                    +

                    Should this happen, check the Docker logs for more information.

                    +
                    docker logs aprom
                    +
                    +
                    +

                    Usually the reason for the failure is described in the logs.

                    +
                    +
                    +

                    Files And Directory Permissions

                    +
                    +

                    Note

                    +

                    Avoid running Docker containers as root.

                    +
                    +

                    The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                    +

                    If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                    +
                    +

                    Note

                    +

                    If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                    +
                    +

                    For example if your Prometheus data directory is /prom-data and you are using centos user

                    +
                    ls -la /|grep prom-data
                    +
                    +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                    +
                    +sudo chown -R centos:centos /prom-data
                    +
                    +ls -la /|grep prom-data
                    +
                    +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                    +
                    +
                    +
                    +
                    +

                    No Data Points

                    +

                    No data points on all data charts.

                    +
                    +

                    Solution

                    +

                    If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                    +
                      +
                    1. Login to the Prometheus console:

                    2. +
                    3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                    4. +
                    5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                    6. +
                    +
                    +
                      +
                    • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                    • +
                    • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                    • +
                    • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                    • +
                    +
                    +

                    For example:

                    +
                    ./start-all.sh -v 3.1
                    +
                    +
                    +

                    More on start-all.sh options.

                    +
                    +
                    +
                    +

                    Grafana Chart Shows Error (!) Sign

                    +

                    Run this procedure on the Scylla Monitoring Stack server.

                    +

                    If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                    +
                    +

                    Solution

                    +

                    On the Scylla Monitoring Stack server:

                    +
                      +
                    1. Check Prometheus is running using docker ps.

                    2. +
                    +
                      +
                    • If it is not running check the prometheus.yml for errors.

                    • +
                    +

                    For example:

                    +
                    CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                    +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                    +
                    +
                    +
                      +
                    • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                    • +
                    +
                    +
                    +
                    +

                    Grafana Shows Server Level Metrics, but not Scylla Metrics

                    +

                    Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                    +
                    +

                    Solution

                    +
                      +
                    • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                    • +
                    +

                    For example

                    +
                    curl 172.17.0.2:9180/metrics
                    +
                    +
                    +
                    +
                    +
                    +

                    Grafana Shows Scylla Metrics, but not Server Level Metrics

                    +

                    Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                    +
                    +

                    Solution

                    +

                    1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                    +
                      +
                    1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                    2. +
                    +
                    +
                    +

                    Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                    +

                    While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                    +

                    If the node_exporter service is not starting it may need to be updated manually.

                    +

                    Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                    +
                    +
                    +
                    +

                    Working with Wireshark

                    +

                    No metrics shown in the Scylla Monitoring Stack.

                    +
                      +
                    1. Install wireshark

                    2. +
                    +

                    2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                    +

                    For example:

                    +
                    tshark -i eth0 -f "dst port 9180"
                    +
                    +
                    +

                    Capture from Scylla node towards Scylla Monitoring Stack server.

                    +

                    In this example, Scylla is running.

                    +
                    Monitor ip        Scylla node ip
                    +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                    +
                    +
                    +

                    In this example, Scylla is not running

                    +
                    Monitor ip        Scylla node ip
                    +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                    +
                    +
                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/index.html b/branch-4.0/upgrade/index.html new file mode 100644 index 000000000..8c964c46b --- /dev/null +++ b/branch-4.0/upgrade/index.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Scylla Monitoring Stack

                    +
                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..168e3a888 --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,780 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                    +

                    Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                    +
                    +

                    Upgrade Procedure

                    +
                    +

                    1. Upgrade to the latest 1.x version

                    +

                    Before starting the upgrade procedure, make sure you are running the latest 1.x version

                    +
                    +
                    +

                    2. Install the new monitoring stack

                    +
                      +
                    1. Download the 2.x version from the release page.

                    2. +
                    3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                    4. +
                    5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                      +
                        +
                      • scylla_servers.yml

                      • +
                      • scylla_manager_servers.yml

                      • +
                      • node_exporter_servers.yml

                      • +
                      +
                    6. +
                    7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                    8. +
                    +
                    ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                    +
                    +
                    +
                    +

                    Note

                    +

                    Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                    +
                    +

                    While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                    +
                    ./kill-all.sh -g 3001 -p 9091 -m 9094
                    +
                    +
                    +
                    +

                    Validation

                    +

                    Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                    +
                    +
                    +
                    +

                    3. Alerting Rules

                    +

                    Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                    +
                    +
                    +

                    4. Moving to Prometheus 2.x

                    +

                    Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                    +

                    Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                    +
                    +

                    a. Set the old system

                    +

                    The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                    +
                      +
                    • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                    • +
                    • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                    • +
                    +
                    +

                    Note

                    +

                    After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                    +
                    +
                    +
                    +

                    b. Set the new system

                    +

                    The following step will allow the new monitoring system to read historical metrics from the old system.

                    +
                      +
                    • In the Prometheus prometheus.yml.template file add the following at the end:

                    • +
                    +
                    remote_read:
                    +  - url: "http://{ip}:9111/api/v1/read"
                    +
                    +
                    +

                    Where {ip} is the ip of the old system.

                    +
                      +
                    • restart the new stack

                    • +
                    +
                    +
                    +
                    +

                    Validate the upgrade

                    +

                    You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                    +
                    +
                    +
                    +

                    Rollback

                    +

                    In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..a6a0c1e40 --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,774 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                    +
                    +

                    Upgrade Procedure

                    +

                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                    +

                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                    +
                    +

                    Install 2.y (The new version)

                    +
                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                    +unzip scylla-monitoring-2.y.zip
                    +cd scylla-monitoring-scylla-monitoring-2.y/
                    +
                    +
                    +

                    Replace “y” with the new minor release number, for example, 2.1.zip

                    +
                    +
                    +

                    Setting the server’s files

                    +

                    Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                    +
                    cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                    +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                    +
                    +
                    +
                    +
                    +

                    Validate the new version is running the correct version

                    +

                    Starting from Scylla-Monitoring version 2.2, you can run:

                    +
                    ./start-all.sh --version
                    +
                    +
                    +

                    To validate the Scylla-Monitoring version.

                    +
                    +
                    +

                    Validate the version installed correctly

                    +

                    To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                    +
                    ./start-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                    +

                    Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                    +
                    +

                    Caution

                    +

                    Important: do not use the local dir flag when testing!

                    +
                    +

                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                    +
                    +

                    Caution

                    +

                    Important: Do not kill the 2.x version that is currently running.

                    +
                    +

                    Use the following command to kill the containers:

                    +
                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    You can start and stop the new 2.y version while testing.

                    +
                    +
                    +

                    Move to version 2.y (the new version)

                    +

                    Note: migrating will cause a few seconds of blackout in the system.

                    +

                    We assume that you are using external volume to store the metrics data.

                    +
                    +

                    Kill all containers

                    +

                    Follow the instruction on how to kill the 2.y version when in testing mode.

                    +

                    To kill the 2.x version containers, run:

                    +
                    ./kill-all.sh
                    +
                    +
                    +

                    Start version 2.y in normal mode

                    +

                    From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                    +
                    ./start-all.sh -d /path/to/data/dir
                    +
                    +
                    +

                    Point your browser to http://{ip}:3000 and see that the data is there.

                    +
                    +
                    +
                    +

                    Rollback to version 2.x

                    +

                    To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                    +

                    To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                    +
                    ./kill-all.sh
                    +cd /path/to/scylla-grafana-2.x/
                    +./start-all.sh -d /path/to/data/dir
                    +
                    +
                    +
                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..c9a1bd6e6 --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,738 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                    +

                    Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                    +
                    +

                    Upgrade Procedure

                    +
                    +

                    1. Validate node_exporter version

                    +

                    Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                    +

                    If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                    +
                    +
                    +

                    2. Install the new monitoring stack

                    +
                      +
                    1. Download the 3.x version from the release page.

                    2. +
                    3. Unzip it into a different directory.

                    4. +
                    5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                      +
                        +
                      • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                      • +
                      • scylla_manager_servers.yml

                      • +
                      +
                      +
                      +

                      Note

                      +

                      The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                      +
                      +
                      +
                    6. +
                    7. Stop the old monitoring stack

                      +
                      +
                      ./kill-all.sh
                      +
                      +
                      +
                      +
                    8. +
                    9. Start the new monitoring stack

                      +
                      +
                      ./start-all.sh -d /prometheus-data-path
                      +
                      +
                      +
                      +
                    10. +
                    +
                    +
                    +

                    Validate the upgrade

                    +

                    You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                    +

                    Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                    +
                    +
                    +
                    +

                    Rollback

                    +

                    To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..b67b4c251 --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,782 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                    +
                    +

                    Upgrade Procedure

                    +

                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                    +

                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                    +
                    +

                    Install 3.y (The new version)

                    +
                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                    +unzip scylla-monitoring-3.y.zip
                    +cd scylla-monitoring-scylla-monitoring-3.y/
                    +
                    +
                    +

                    Replace “y” with the new minor release number, for example, 3.0.1.zip

                    +
                    +
                    +

                    Setting the server’s files

                    +

                    Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                    +
                    cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                    +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                    +
                    +
                    +
                    +
                    +

                    Validate the new version is running the correct version

                    +

                    Starting from Scylla-Monitoring version 2.2, you can run:

                    +
                    ./start-all.sh --version
                    +
                    +
                    +

                    To validate the Scylla-Monitoring version.

                    +
                    +
                    +

                    Validate the version installed correctly

                    +

                    To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                    +
                    ./start-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                    +

                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                    +
                    +

                    Caution

                    +

                    Important: do not use the local dir flag when testing!

                    +
                    +

                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                    +
                    +

                    Caution

                    +

                    Important: Do not kill the 3.x version that is currently running.

                    +
                    +
                    +
                    +

                    Killing the new 3.y Monitoring stack in testing mode

                    +

                    Use the following command to kill the containers:

                    +
                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    You can start and stop the new 3.y version while testing.

                    +
                    +
                    +

                    Move to version 3.y (the new version)

                    +

                    Note: migrating will cause a few seconds of blackout in the system.

                    +

                    We assume that you are using external volume to store the metrics data.

                    +
                    +

                    Kill all containers

                    +

                    At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                    +

                    Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                    +

                    kill the older 3.x version containers by running:

                    +
                    ./kill-all.sh
                    +
                    +
                    +

                    Start version 3.y in normal mode

                    +

                    From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                    +
                    ./start-all.sh -d /path/to/data/dir
                    +
                    +
                    +

                    Point your browser to http://{ip}:3000 and see that the data is there.

                    +
                    +
                    +
                    +

                    Rollback to version 3.x

                    +

                    To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                    +

                    To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                    +
                    ./kill-all.sh
                    +cd /path/to/scylla-grafana-3.x/
                    +./start-all.sh -d /path/to/data/dir
                    +
                    +
                    +
                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..c9841cd8e --- /dev/null +++ b/branch-4.0/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,925 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                    +

                    This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                    +
                    +

                    Upgrade Procedure

                    +

                    We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                    +

                    Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                    +
                    +

                    Install 4.y (The new version)

                    +
                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                    +unzip scylla-monitoring-4.y.zip
                    +cd scylla-monitoring-scylla-monitoring-4.y/
                    +
                    +
                    +

                    Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                    +
                    +
                    +

                    Setting the server’s files

                    +

                    Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                    +
                    cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                    +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                    +
                    +
                    +
                    +
                    +

                    Validate the new version is running the correct version

                    +

                    run:

                    +
                    ./start-all.sh --version
                    +
                    +
                    +

                    To validate the Scylla-Monitoring version.

                    +
                    +
                    +
                    +

                    Running in test mode

                    +

                    This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                    +
                    +

                    Running second monitoring stack

                    +

                    We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                    +
                    ./start-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    Browse to http://{ip}:9091 and check the Grafana dashboard.

                    +

                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                    +
                    +

                    Caution

                    +

                    Important: do not use the local dir flag when testing!

                    +
                    +

                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                    +
                    +

                    Caution

                    +

                    Important: Do not kill the 3.x version that is currently running!

                    +
                    +
                    +
                    +

                    Killing the new 4.y Monitoring stack in testing mode

                    +

                    Use the following command to kill the containers:

                    +
                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                    +
                    +
                    +

                    You can start and stop the new 4.y version while testing.

                    +
                    +
                    +
                    +

                    Migrating

                    +
                    +

                    Move to version 4.y (the new version)

                    +

                    Note: migrating will cause a few seconds of blackout in the system.

                    +

                    We assume that you are using external volume to store the metrics data.

                    +
                    +

                    Backup

                    +

                    We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                    +
                    +
                    +

                    Kill all containers

                    +

                    At this point you have two monitoring stacks installed with the older version running.

                    +

                    If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                    +

                    kill the older 3.x version containers by running:

                    +
                    ./kill-all.sh
                    +
                    +
                    +

                    Start version 4.y in normal mode

                    +

                    From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                    +
                    ./start-all.sh -d /path/to/copy/data/dir
                    +
                    +
                    +

                    Point your browser to http://{ip}:3000 and see that the data is there.

                    +
                    +
                    +
                    +

                    Rollback to version 3.x

                    +

                    To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                    +

                    To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                    +
                    ./kill-all.sh
                    +cd /path/to/scylla-grafana-3.x/
                    +./start-all.sh -d /path/to/original/data/dir
                    +
                    +
                    +
                    +
                    +
                    +

                    Post-installation: Metrics back-filling

                    +

                    Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                    +

                    For example, this is a recording rule that calculates the p99 write latency:

                    +
                    - record: wlatencyp99
                    +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                    +  labels:
                    +    by: "instance,shard"
                    +
                    +
                    +

                    For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                    +

                    Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                    +
                    +
                    +

                    Note

                    +

                    If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                    +
                    +
                    +
                    +../_images/before-backfilling.png +
                    +

                    This is an example of missing latency graph

                    +
                    +
                    +

                    The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                    +

                    For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                    +

                    In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                    +

                    The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                    +
                    +

                    Determine the backfilling period

                    +

                    When you run the backfilling process you need to determine the start time and end time.

                    +
                    +

                    Determine the start time

                    +

                    The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                    +

                    If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                    +

                    For the rest of this example, we will assume that your retention time is 360 days.

                    +
                    +
                    +

                    Determine the end time

                    +

                    Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                    +

                    If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                    +

                    That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                    +

                    The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                    +
                    +
                    +
                    +

                    Backfilling Process

                    +
                    +

                    backup

                    +

                    If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                    +

                    To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                    +
                    +
                    +

                    Restart the monitoring stack

                    +

                    You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                    +

                    -b "--storage.tsdb.allow-overlapping-blocks"

                    +
                    +
                    +

                    Create the data files

                    +

                    We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                    +

                    The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                    +

                    Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                    +
                    docker exec -it aprom sh
                    +cd /prometheus/data/
                    +promtool tsdb create-blocks-from rules \
                    +--start $start \
                    +--end $end \
                    +--url http://localhost:9090 \
                    +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                    +
                    +
                    +

                    It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                    +
                    +
                    +

                    Note

                    +

                    Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                    +
                    +
                    +
                    +
                    +

                    Copy the data files

                    +

                    Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                    +

                    Copy the data files to the Prometheus directory:

                    +
                    cp data/* .
                    +
                    +
                    +

                    The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                    +

                    Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                    +
                    +../_images/after-backfilling.jpg +
                    +

                    Un example: after loading half of the data

                    +
                    +
                    +
                    +
                    +
                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.0/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..66d16e7f9 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries use ALLOW FILTERING

                    +

                    Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                    +

                    These kinds of queries can create a bigger load on Scylla, and should be used with care.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlCLAll.html b/branch-4.0/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..f6e880425 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries use Consistency Level: ALL

                    +

                    Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                    +

                    Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                    +

                    Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlCLAny.html b/branch-4.0/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..a9d53d117 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries use Consistency Level: ANY

                    +

                    Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                    +

                    Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.0/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..ca281fb7f --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries are not token-aware

                    +

                    Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                    +

                    Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlNonPaged.html b/branch-4.0/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..16aa8369f --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some SELECT queries are non-paged

                    +

                    By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                    +
                    +

                    Blog-post Links

                    +

                    https://www.scylladb.com/2018/07/13/efficient-query-paging/

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.0/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..0c4073d04 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries are non-prepared

                    +

                    Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.0/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..7bb5d7481 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Some queries use reverse order

                    +

                    Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                    +

                    Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/heavyCompaction.html b/branch-4.0/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..ba5fd28a0 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Compaction takes lots of memory and CPU

                    +

                    ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                    +

                    If this is the case, you can do one of the following:

                    +
                      +
                    • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                      +
                      +
                        +
                      • In the scylla.yml configuration file: compaction_static_shares: 100

                      • +
                      • In the command line when starting ScyllaDB: --compaction-static-shares 100

                      • +
                      +
                      +

                      You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                      +
                    • +
                    • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                    • +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/index.html b/branch-4.0/use-monitoring/advisor/index.html new file mode 100644 index 000000000..1fdd9718f --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/index.html @@ -0,0 +1,699 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Scylla Monitoring Stack Advisor

                    +
                    +
                    +

                    The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                    +
                    +

                    The Advisor section

                    +
                    +../../_images/advisor_panel.png +
                    +

                    The Advisor section

                    +
                    +
                    +

                    The Advisor section is located on the Overview dashboard and consists of two parts:

                    +

                    On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                    +

                    For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                    +

                    On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                    +

                    For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                    +

                    Each Advisor issue is explained in detail:

                    + +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/nodeCLErrors.html b/branch-4.0/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..2594bbf56 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Some operation failed due to unsatisfied consistency level

                    +

                    ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                    +

                    For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                    +

                    When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/nodeIOErrors.html b/branch-4.0/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..73bb52d4b --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    I/O Errors can indicate a node with a faulty disk

                    +

                    I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.0/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..0943cf0a3 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Some operations failed on the replica side

                    +

                    ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                    +

                    An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.0/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..3bd38d7a3 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    CQL queries are not balanced among shards

                    +

                    For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                    +

                    There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                    +
                    +

                    Blog post link

                    +

                    https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.0/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..9c305c94a --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    Prepared statements cache eviction

                    +

                    Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                    +
                      +
                    • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                    • +
                    • The prepared statements cache might be too small for the number of prepared statements.

                    • +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/advisor/systemOverload.html b/branch-4.0/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..b12fc73a2 --- /dev/null +++ b/branch-4.0/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    System Overload

                    +

                    There could be multiple indications that a system is overloaded:

                    +
                      +
                    • Timeouts

                    • +
                    • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                    • +
                    • CPU at 100% when no background process (like compaction or repair) runs.

                    • +
                    • Ques are getting filled.

                    • +
                    +

                    If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/cql_optimization.html b/branch-4.0/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..62d36086a --- /dev/null +++ b/branch-4.0/use-monitoring/cql_optimization.html @@ -0,0 +1,786 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + + + +
                    +

                    The CQL Optimization

                    +

                    The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                    +
                    +../_images/cql_optimization_master.png +
                    +

                    The CQL Dashboard

                    +
                    +
                    +

                    The upper part of the dashboard holds CQL related metrics.

                    +

                    The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                    +
                    +

                    Note

                    +

                    Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                    +
                    +

                    The following sections describe each of the dashboard’s panel

                    +
                    +

                    Prepared Statements

                    +

                    Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                    +

                    Using prepared statements has the following benefits:

                    +
                      +
                    • The database only needs to parse the query once

                    • +
                    • The driver can route the query to the right node

                    • +
                    • Using place-holders and values is safer and prevents CQL-Injection

                    • +
                    +

                    The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                    +

                    The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                    +
                    +
                    +

                    Token Aware

                    +

                    Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                    +

                    Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                    +

                    The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                    +

                    The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                    +
                    +
                    +

                    Paged Queries

                    +

                    By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                    +

                    The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                    +

                    The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                    +
                    +
                    +

                    Reversed CQL Reads

                    +

                    Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                    +

                    Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                    +

                    For example, look at the following table:

                    +
                    CREATE TABLE ks1.table_demo (
                    +   category text,
                    +   type int,
                    +   PRIMARY KEY (category, type))
                    +WITH CLUSTERING ORDER BY (type DESC);
                    +
                    +
                    +

                    The following query uses reverse order:

                    +
                    select * from ks1.table_demo where category='cat1' order by type ASC;
                    +
                    +
                    +

                    The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                    +

                    The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                    +
                    +
                    +

                    ALLOW FILTERING

                    +

                    Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                    +

                    These kinds of queries can create a big load on the system, and should be used with care.

                    +

                    The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                    +

                    The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                    +

                    The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                    +

                    The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                    +

                    The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                    +
                    +
                    +

                    Consistency Level

                    +

                    Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                    +

                    The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                    +

                    Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                    +

                    The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                    +

                    The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                    +

                    The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                    +

                    The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                    +
                    +
                    +

                    Cross DC

                    +

                    Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                    +
                    +
                    +

                    Cross DC Consistency Level

                    +

                    Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                    +
                    +
                    +

                    Cross DC read requests

                    +
                    +

                    Note

                    +

                    The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                    +
                    +

                    In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                    +

                    The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                    +
                    +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.0/use-monitoring/index.html b/branch-4.0/use-monitoring/index.html new file mode 100644 index 000000000..e4e536574 --- /dev/null +++ b/branch-4.0/use-monitoring/index.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +
                    +

                    Using Scylla Monitoring Stack

                    +
                    +
                    +

                    There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                    + +
                    + + +
                    + + + + + + + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.1/.buildinfo b/branch-4.1/.buildinfo new file mode 100644 index 000000000..74d42bf0d --- /dev/null +++ b/branch-4.1/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 04ed94f54cf6fd63b7b2de5ec1216c05 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.1/.doctrees/_common/monitor-description.doctree b/branch-4.1/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..d7f5937a9 Binary files /dev/null and b/branch-4.1/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-4.1/.doctrees/environment.pickle b/branch-4.1/.doctrees/environment.pickle new file mode 100644 index 000000000..327d171e5 Binary files /dev/null and b/branch-4.1/.doctrees/environment.pickle differ diff --git a/branch-4.1/.doctrees/index.doctree b/branch-4.1/.doctrees/index.doctree new file mode 100644 index 000000000..b635516eb Binary files /dev/null and b/branch-4.1/.doctrees/index.doctree differ diff --git a/branch-4.1/.doctrees/install/docker_compose.doctree b/branch-4.1/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..2ada7cbd3 Binary files /dev/null and b/branch-4.1/.doctrees/install/docker_compose.doctree differ diff --git a/branch-4.1/.doctrees/install/index.doctree b/branch-4.1/.doctrees/install/index.doctree new file mode 100644 index 000000000..3829522c7 Binary files /dev/null and b/branch-4.1/.doctrees/install/index.doctree differ diff --git a/branch-4.1/.doctrees/install/min-prod-hw.doctree b/branch-4.1/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..34b2f4e21 Binary files /dev/null and b/branch-4.1/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.1/.doctrees/install/monitor_without_docker.doctree b/branch-4.1/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..3005ff2a0 Binary files /dev/null and b/branch-4.1/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-4.1/.doctrees/install/monitoring_stack.doctree b/branch-4.1/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..a79d3aca4 Binary files /dev/null and b/branch-4.1/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-4.1/.doctrees/install/start_all.doctree b/branch-4.1/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..322f9610e Binary files /dev/null and b/branch-4.1/.doctrees/install/start_all.doctree differ diff --git a/branch-4.1/.doctrees/install/thanos.doctree b/branch-4.1/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..a1935bfd0 Binary files /dev/null and b/branch-4.1/.doctrees/install/thanos.doctree differ diff --git a/branch-4.1/.doctrees/intro.doctree b/branch-4.1/.doctrees/intro.doctree new file mode 100644 index 000000000..41be932fc Binary files /dev/null and b/branch-4.1/.doctrees/intro.doctree differ diff --git a/branch-4.1/.doctrees/procedures/alerts/alerting.doctree b/branch-4.1/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..2a20e2c81 Binary files /dev/null and b/branch-4.1/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.1/.doctrees/procedures/alerts/index.doctree b/branch-4.1/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..9a9036bb0 Binary files /dev/null and b/branch-4.1/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.1/.doctrees/procedures/datadog/index.doctree b/branch-4.1/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..7e73416c5 Binary files /dev/null and b/branch-4.1/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.1/.doctrees/procedures/index.doctree b/branch-4.1/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..32258f0c5 Binary files /dev/null and b/branch-4.1/.doctrees/procedures/index.doctree differ diff --git a/branch-4.1/.doctrees/procedures/updating_dashboard.doctree b/branch-4.1/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..34d2f1bee Binary files /dev/null and b/branch-4.1/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-4.1/.doctrees/reference/index.doctree b/branch-4.1/.doctrees/reference/index.doctree new file mode 100644 index 000000000..9e3c41d33 Binary files /dev/null and b/branch-4.1/.doctrees/reference/index.doctree differ diff --git a/branch-4.1/.doctrees/reference/matrix.doctree b/branch-4.1/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..317a40c2d Binary files /dev/null and b/branch-4.1/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.1/.doctrees/reference/monitoring_apis.doctree b/branch-4.1/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..255c63c38 Binary files /dev/null and b/branch-4.1/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-4.1/.doctrees/troubleshooting/index.doctree b/branch-4.1/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..42022a1a2 Binary files /dev/null and b/branch-4.1/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.1/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-4.1/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..06657398e Binary files /dev/null and b/branch-4.1/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/index.doctree b/branch-4.1/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..e065e5e83 Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..a3ed17079 Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..29c01fbd9 Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..692cbf55e Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..eb4c2b6e8 Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..5bed03291 Binary files /dev/null and b/branch-4.1/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..b5023f299 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..0d531885d Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..e988ea279 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..9be925c37 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..4db81c672 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..cf55d30a9 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..fe101b8fe Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..fb8844dc6 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..d6289678c Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..53df39df2 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..84cfad975 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..44b4a7bda Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..5fdfd4873 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..777c17277 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.1/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..c080efe23 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/cql_optimization.doctree b/branch-4.1/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..5cbb47045 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-4.1/.doctrees/use-monitoring/index.doctree b/branch-4.1/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..c65d98258 Binary files /dev/null and b/branch-4.1/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.1/.nojekyll b/branch-4.1/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.1/404.html b/branch-4.1/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.1/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                    +

                    404

                    +

                    The ScyllaDB monster ate your page!

                    +

                    + Home +

                    +
                    + + + \ No newline at end of file diff --git a/branch-4.1/CNAME b/branch-4.1/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.1/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.1/_common/monitor-description.html b/branch-4.1/_common/monitor-description.html new file mode 100644 index 000000000..e4146ff11 --- /dev/null +++ b/branch-4.1/_common/monitor-description.html @@ -0,0 +1,646 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    + + + +
                    +
                    + Menu +
                    +
                    +
                    +
                    +
                    + + +
                    +

                    Caution

                    +

                    + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                    +
                    + + + +
                    + +
                    + +

                    ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                    + + +
                    + + + + + +
                    + + +
                    + +
                    + +
                    + + + + +
                    + + + + + + + \ No newline at end of file diff --git a/branch-4.1/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.1/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.1/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.1/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.1/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..01b3668be --- /dev/null +++ b/branch-4.1/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,125 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={level=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.1/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.1/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..c566d6300 --- /dev/null +++ b/branch-4.1/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","comparator":"<=","value":0},{"palette":"white_on_green","comparator":"<=","value":3},{"palette":"white_on_red","comparator":">","value":3}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":104,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":104,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":73,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"response_format":"timeseries","style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":98,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":104,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":104,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","is_read_only":false,"notify_list":[],"id":"r42-yag-cuw"} diff --git a/branch-4.1/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.1/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..d15af0322 --- /dev/null +++ b/branch-4.1/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,123 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={level=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.1/_images/1.png b/branch-4.1/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.1/_images/1.png differ diff --git a/branch-4.1/_images/2.png b/branch-4.1/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.1/_images/2.png differ diff --git a/branch-4.1/_images/3.png b/branch-4.1/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.1/_images/3.png differ diff --git a/branch-4.1/_images/advisor_panel.png b/branch-4.1/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.1/_images/advisor_panel.png differ diff --git a/branch-4.1/_images/after-backfilling.jpg b/branch-4.1/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.1/_images/after-backfilling.jpg differ diff --git a/branch-4.1/_images/alertmanager.png b/branch-4.1/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.1/_images/alertmanager.png differ diff --git a/branch-4.1/_images/before-backfilling.png b/branch-4.1/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.1/_images/before-backfilling.png differ diff --git a/branch-4.1/_images/cql_optimization_master.png b/branch-4.1/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.1/_images/cql_optimization_master.png differ diff --git a/branch-4.1/_images/datadog.png b/branch-4.1/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.1/_images/datadog.png differ diff --git a/branch-4.1/_images/grafana.png b/branch-4.1/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.1/_images/grafana.png differ diff --git a/branch-4.1/_images/monitor.png b/branch-4.1/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.1/_images/monitor.png differ diff --git a/branch-4.1/_images/monitoring_stack.png b/branch-4.1/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.1/_images/monitoring_stack.png differ diff --git a/branch-4.1/_images/monitoring_stack1.png b/branch-4.1/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.1/_images/monitoring_stack1.png differ diff --git a/branch-4.1/_sources/_common/monitor-description.rst.txt b/branch-4.1/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.1/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.1/_sources/index.rst.txt b/branch-4.1/_sources/index.rst.txt new file mode 100644 index 000000000..97ea5ff5a --- /dev/null +++ b/branch-4.1/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on Scylla University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.1/_sources/install/docker_compose.rst.txt b/branch-4.1/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.1/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.1/_sources/install/index.rst.txt b/branch-4.1/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-4.1/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.1/_sources/install/min-prod-hw.rst.txt b/branch-4.1/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..443638374 --- /dev/null +++ b/branch-4.1/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,32 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. diff --git a/branch-4.1/_sources/install/monitor_without_docker.rst.txt b/branch-4.1/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..a53e9c6c5 --- /dev/null +++ b/branch-4.1/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,504 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories + +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.1/_sources/install/monitoring_stack.rst.txt b/branch-4.1/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..a20ec7363 --- /dev/null +++ b/branch-4.1/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,392 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API <../../reference/monitoring_apis/#prometheus>`_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.1/_sources/install/start_all.rst.txt b/branch-4.1/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..c2e927a99 --- /dev/null +++ b/branch-4.1/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.1/_sources/install/thanos.rst.txt b/branch-4.1/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.1/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.1/_sources/intro.rst.txt b/branch-4.1/_sources/intro.rst.txt new file mode 100644 index 000000000..67e73435b --- /dev/null +++ b/branch-4.1/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.1/_sources/procedures/alerts/alerting.rst.txt b/branch-4.1/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.1/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.1/_sources/procedures/alerts/index.rst.txt b/branch-4.1/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.1/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.1/_sources/procedures/datadog/index.rst.txt b/branch-4.1/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..d15b2c8b6 --- /dev/null +++ b/branch-4.1/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,58 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Loading Scylla dashboard to Datadog. +3. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the promemtheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.1/_sources/procedures/index.rst.txt b/branch-4.1/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..9e17f2aa1 --- /dev/null +++ b/branch-4.1/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.1/_sources/procedures/updating_dashboard.rst.txt b/branch-4.1/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.1/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.1/_sources/reference/index.rst.txt b/branch-4.1/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-4.1/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.1/_sources/reference/matrix.rst.txt b/branch-4.1/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..bca3826ef --- /dev/null +++ b/branch-4.1/_sources/reference/matrix.rst.txt @@ -0,0 +1,130 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.1/_sources/reference/monitoring_apis.rst.txt b/branch-4.1/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-4.1/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.1/_sources/troubleshooting/index.rst.txt b/branch-4.1/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-4.1/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.1/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-4.1/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..a2e14a1f4 --- /dev/null +++ b/branch-4.1/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,221 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + + + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.1/_sources/upgrade/index.rst.txt b/branch-4.1/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..817f65247 --- /dev/null +++ b/branch-4.1/_sources/upgrade/index.rst.txt @@ -0,0 +1,42 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                    +
                    +
                    +
                    Upgrade Scylla Open Source
                    +
                    +
                    + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                    +
                    +
                    diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..b64fd5d7e --- /dev/null +++ b/branch-4.1/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,281 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.1/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.1/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.1/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.1/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.1/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.1/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.1/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.1/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.1/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.1/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.1/_sources/use-monitoring/cql_optimization.rst.txt b/branch-4.1/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.1/_sources/use-monitoring/index.rst.txt b/branch-4.1/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-4.1/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.1/_static/basic.css b/branch-4.1/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.1/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.1/_static/check-solid.svg b/branch-4.1/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.1/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.1/_static/clipboard.min.js b/branch-4.1/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.1/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.1/_static/copybutton.css b/branch-4.1/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.1/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                    Short

                    + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.1/_static/copybutton.js b/branch-4.1/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.1/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.1/_static/copybutton_funcs.js b/branch-4.1/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.1/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.1/_static/css/main.css b/branch-4.1/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-4.1/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.1/_static/doctools.js b/branch-4.1/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.1/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.1/_static/documentation_options.js b/branch-4.1/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.1/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.1/_static/file.png b/branch-4.1/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.1/_static/file.png differ diff --git a/branch-4.1/_static/img/banner-background.svg b/branch-4.1/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.1/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.1/_static/img/favicon-228x228.png b/branch-4.1/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.1/_static/img/favicon-228x228.png differ diff --git a/branch-4.1/_static/img/favicon-32x32.png b/branch-4.1/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.1/_static/img/favicon-32x32.png differ diff --git a/branch-4.1/_static/img/favicon.ico b/branch-4.1/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.1/_static/img/favicon.ico differ diff --git a/branch-4.1/_static/img/icons/icon-about-team.svg b/branch-4.1/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.1/_static/img/icons/icon-about-us-m.svg b/branch-4.1/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-about-us.svg b/branch-4.1/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-alternator.svg b/branch-4.1/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-apps.svg b/branch-4.1/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-architecture.svg b/branch-4.1/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.1/_static/img/icons/icon-benchmarks.svg b/branch-4.1/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.1/_static/img/icons/icon-blog.svg b/branch-4.1/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.1/_static/img/icons/icon-careers.svg b/branch-4.1/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.1/_static/img/icons/icon-chevron-left.svg b/branch-4.1/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.1/_static/img/icons/icon-chevron-right.svg b/branch-4.1/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.1/_static/img/icons/icon-circe.svg b/branch-4.1/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-clock.svg b/branch-4.1/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-close.svg b/branch-4.1/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-cloud-docs.svg b/branch-4.1/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-cloud.svg b/branch-4.1/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-comparison.svg b/branch-4.1/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.1/_static/img/icons/icon-contact-us.svg b/branch-4.1/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.1/_static/img/icons/icon-developers-blog.svg b/branch-4.1/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.1/_static/img/icons/icon-docs.svg b/branch-4.1/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.1/_static/img/icons/icon-enterprise-m.svg b/branch-4.1/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-enterprise.svg b/branch-4.1/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-events.svg b/branch-4.1/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.1/_static/img/icons/icon-exclamation.svg b/branch-4.1/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-expand.svg b/branch-4.1/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-forum.svg b/branch-4.1/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-getting-started.svg b/branch-4.1/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-glossary.svg b/branch-4.1/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-home.svg b/branch-4.1/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-infoworld.svg b/branch-4.1/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.1/_static/img/icons/icon-integrations.svg b/branch-4.1/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-knowledge-base.svg b/branch-4.1/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-less.svg b/branch-4.1/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-live-test.svg b/branch-4.1/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.1/_static/img/icons/icon-mail-list.svg b/branch-4.1/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-manager.svg b/branch-4.1/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.1/_static/img/icons/icon-memory-management.svg b/branch-4.1/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.1/_static/img/icons/icon-modeling.svg b/branch-4.1/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-monitoring.svg b/branch-4.1/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.1/_static/img/icons/icon-networking.svg b/branch-4.1/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.1/_static/img/icons/icon-news.svg b/branch-4.1/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.1/_static/img/icons/icon-newsletter.svg b/branch-4.1/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.1/_static/img/icons/icon-nsql-guides.svg b/branch-4.1/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.1/_static/img/icons/icon-open-source.svg b/branch-4.1/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.1/_static/img/icons/icon-operator.svg b/branch-4.1/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-overview.svg b/branch-4.1/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.1/_static/img/icons/icon-partners.svg b/branch-4.1/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.1/_static/img/icons/icon-plus.svg b/branch-4.1/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-pricing.svg b/branch-4.1/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.1/_static/img/icons/icon-release-notes.svg b/branch-4.1/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.1/_static/img/icons/icon-resource-center.svg b/branch-4.1/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.1/_static/img/icons/icon-roadmap.svg b/branch-4.1/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.1/_static/img/icons/icon-search.svg b/branch-4.1/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.1/_static/img/icons/icon-slack.svg b/branch-4.1/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-stack-overflow.svg b/branch-4.1/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.1/_static/img/icons/icon-summit.svg b/branch-4.1/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/icons/icon-support.svg b/branch-4.1/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.1/_static/img/icons/icon-tech-talks.svg b/branch-4.1/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.1/_static/img/icons/icon-testing.svg b/branch-4.1/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.1/_static/img/icons/icon-thumbs-down.svg b/branch-4.1/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-thumbs-up.svg b/branch-4.1/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.1/_static/img/icons/icon-tip.svg b/branch-4.1/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.1/_static/img/icons/icon-training.svg b/branch-4.1/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.1/_static/img/icons/icon-triangle-down.svg b/branch-4.1/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.1/_static/img/icons/icon-university.svg b/branch-4.1/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.1/_static/img/icons/icon-users-blog.svg b/branch-4.1/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.1/_static/img/icons/icon-warning.svg b/branch-4.1/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.1/_static/img/icons/icon-webinars.svg b/branch-4.1/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.1/_static/img/icons/icon-whitepapers.svg b/branch-4.1/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.1/_static/img/icons/icon-workshop.svg b/branch-4.1/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.1/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.1/_static/img/logo-docs.svg b/branch-4.1/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.1/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.1/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.1/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.1/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.1/_static/img/mascots/404.jpg b/branch-4.1/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.1/_static/img/mascots/404.jpg differ diff --git a/branch-4.1/_static/img/mascots/scylla-3monsters.png b/branch-4.1/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.1/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-alternator.svg b/branch-4.1/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.1/_static/img/mascots/scylla-cloud.svg b/branch-4.1/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.1/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.1/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-computer-headset.png b/branch-4.1/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-cup-number-one.png b/branch-4.1/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-docs.svg b/branch-4.1/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.1/_static/img/mascots/scylla-drivers.svg b/branch-4.1/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.1/_static/img/mascots/scylla-enterprise.svg b/branch-4.1/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.1/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.1/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-forklift-migration.png b/branch-4.1/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-gear.png b/branch-4.1/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-hardhat.png b/branch-4.1/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-headband.png b/branch-4.1/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-headset.png b/branch-4.1/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-hearts.png b/branch-4.1/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-looking-down.png b/branch-4.1/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-looking-up.png b/branch-4.1/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.1/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.1/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-manager.svg b/branch-4.1/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.1/_static/img/mascots/scylla-monitor.svg b/branch-4.1/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.1/_static/img/mascots/scylla-movement-fast.png b/branch-4.1/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-movement.png b/branch-4.1/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-onpremise.png b/branch-4.1/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-opensource.svg b/branch-4.1/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.1/_static/img/mascots/scylla-operator.svg b/branch-4.1/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.1/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.1/_static/img/mascots/scylla-plugin.png b/branch-4.1/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-release-mascot.png b/branch-4.1/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-repair.png b/branch-4.1/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-server.png b/branch-4.1/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-sleeping.png b/branch-4.1/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-tall-measure.png b/branch-4.1/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-university.png b/branch-4.1/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-weights.png b/branch-4.1/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-window-cleaning.png b/branch-4.1/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-with-computer-2.png b/branch-4.1/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-with-computer.png b/branch-4.1/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-with-linux.png b/branch-4.1/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.1/_static/img/mascots/scylla-writting.png b/branch-4.1/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.1/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.1/_static/img/menu.svg b/branch-4.1/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.1/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.1/_static/img/scylla-monitor.png b/branch-4.1/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.1/_static/img/scylla-monitor.png differ diff --git a/branch-4.1/_static/js/main.bundle.js b/branch-4.1/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-4.1/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                  • Back
                  • ',backButtonPosition:"top",wrapper:"
                    ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                      "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                      ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                      ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                      ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                      ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                      "],col:[2,"","
                      "],tr:[2,"","
                      "],td:[3,"","
                      "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + + + +
                      + + + + + +
                      + + +
                      + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/index.html b/branch-4.1/index.html new file mode 100644 index 000000000..ff1f142d9 --- /dev/null +++ b/branch-4.1/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      ScyllaDB Monitoring Stack

                      +
                      +
                      +

                      ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                      +_images/monitor.png +

                      The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                      +
                        +
                      • prometheus - collects and stores metrics

                      • +
                      • alertmanager - handles alerts

                      • +
                      • grafana - dashboard server

                      • +
                      +

                      Choose a topic to get started:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/docker_compose.html b/branch-4.1/install/docker_compose.html new file mode 100644 index 000000000..851cf1b0f --- /dev/null +++ b/branch-4.1/install/docker_compose.html @@ -0,0 +1,810 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Using Docker Compose

                      +

                      Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                      +

                      Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                      +
                      +

                      Warning

                      +

                      docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                      +
                      +
                      +

                      Prerequisite

                      +

                      Make sure you have docker and docker-compose installed.

                      +
                      +
                      +

                      Setting Prometheus

                      +

                      The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                      +

                      You can use ./prometheus-config.sh to generate the file, for example:

                      +
                      ./prometheus-config.sh --compose
                      +
                      +
                      +

                      For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                      +
                      +
                      +

                      Setting Grafana Provisioning

                      +

                      Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                      +
                      +

                      Grafana Data-Source file

                      +

                      Run the following command to update the datasource:

                      +
                      ./grafana-datasource.sh --compose
                      +
                      +
                      +

                      You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                      +
                      +
                      +

                      Grafana Dashboard Load file

                      +

                      To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                      +
                      ./generate-dashboards.sh -t -v 2020.1
                      +
                      +
                      +

                      This command generates the files under: grafana/provisioning/dashboards/

                      +
                      +
                      +
                      +

                      Docker Compose file

                      +

                      You can use the following example as a base for your docker compose.

                      +

                      Pass the following to a file called docker-compose.yml

                      +
                      services:
                      +  alertmanager:
                      +    container_name: aalert
                      +    image: prom/alertmanager:v0.21.0
                      +    ports:
                      +    - 9093:9093
                      +    volumes:
                      +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                      +  grafana:
                      +    container_name: agraf
                      +    environment:
                      +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                      +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                      +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                      +    # This is where you set Grafana security
                      +    - GF_AUTH_BASIC_ENABLED=false
                      +    - GF_AUTH_ANONYMOUS_ENABLED=true
                      +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                      +    - GF_SECURITY_ADMIN_PASSWORD=admin
                      +    image: grafana/grafana:7.3.5
                      +    ports:
                      +    - 3000:3000
                      +    user: 1000:1000
                      +    volumes:
                      +    - ./grafana/build:/var/lib/grafana/dashboards
                      +    - ./grafana/plugins:/var/lib/grafana/plugins
                      +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                      +    # Uncomment the following line for grafana persistency
                      +    # - path/to/grafana/dir:/var/lib/grafana
                      +  loki:
                      +    command:
                      +    - --config.file=/mnt/config/loki-config.yaml
                      +    container_name: loki
                      +    image: grafana/loki:2.0.0
                      +    ports:
                      +    - 3100:3100
                      +    volumes:
                      +    - ./loki/rules:/etc/loki/rules
                      +    - ./loki/conf:/mnt/config
                      +  promotheus:
                      +    command:
                      +    - --config.file=/etc/prometheus/prometheus.compose.yml
                      +    container_name: aprom
                      +    image: prom/prometheus:v2.18.1
                      +    ports:
                      +    - 9090:9090
                      +    volumes:
                      +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                      +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                      +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                      +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                      +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                      +    # Uncomment the following line for prometheus persistency 
                      +    # - path/to/data/dir:/prometheus/data
                      +  promtail:
                      +    command:
                      +    - --config.file=/etc/promtail/config.yml
                      +    container_name: promtail
                      +    image: grafana/promtail:2.0.0
                      +    ports:
                      +    - 1514:1514
                      +    - 9080:9080
                      +    volumes:
                      +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                      +version: '3'
                      +
                      +
                      +
                      +

                      Start and Stop

                      +

                      To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/index.html b/branch-4.1/install/index.html new file mode 100644 index 000000000..79ce9b45d --- /dev/null +++ b/branch-4.1/install/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Download and Install Scylla Monitoring Stack

                      +
                      +
                      +

                      Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                      +

                      Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/min-prod-hw.html b/branch-4.1/install/min-prod-hw.html new file mode 100644 index 000000000..5f1e90944 --- /dev/null +++ b/branch-4.1/install/min-prod-hw.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Minimal Production System Recommendations

                      +
                        +
                      • CPU - at least 2 physical cores/ 4vCPUs

                      • +
                      • Memory - 15GB+ DRAM and proportional to the number of cores.

                      • +
                      • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                      • +
                      • Network - 1GbE/10GbE preferred

                      • +
                      +
                      +

                      Calculating Prometheus Minimal Disk Space requirement

                      +

                      Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                      +

                      Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                      +

                      For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                      +
                      6 * 16 * 15 * 12MB ~ 16GB
                      +
                      +
                      +

                      To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                      +
                      +
                      +

                      Calculating Prometheus Minimal Memory Space requirement

                      +

                      Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                      +

                      For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/monitor_without_docker.html b/branch-4.1/install/monitor_without_docker.html new file mode 100644 index 000000000..a9b05a28d --- /dev/null +++ b/branch-4.1/install/monitor_without_docker.html @@ -0,0 +1,1117 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Deploying Scylla Monitoring Stack Without Docker

                      +
                      +

                      Introduction

                      +

                      The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                      +

                      Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                      +

                      Scylla Monitoring uses the following components:

                      +
                        +
                      • Alertmanager

                      • +
                      • Grafana Loki

                      • +
                      • Prometheus

                      • +
                      • Grafana

                      • +
                      +

                      The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                      +

                      We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                      +
                      +
                      +

                      Minimal Production System Recommendations

                      +
                        +
                      • CPU - at least 2 physical cores/ 4vCPUs

                      • +
                      • Memory - 15GB+ DRAM and proportional to the number of cores.

                      • +
                      • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                      • +
                      • Network - 1GbE/10GbE preferred

                      • +
                      +
                      +

                      Calculating Prometheus Minimal Disk Space requirement

                      +

                      Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                      +

                      Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                      +

                      For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                      +
                      6 * 16 * 15 * 12MB ~ 16GB
                      +
                      +
                      +

                      To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                      +
                      +
                      +

                      Calculating Prometheus Minimal Memory Space requirement

                      +

                      Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                      +

                      For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                      +

                      The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                      +
                      +

                      Note

                      +

                      Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                      +
                      +
                      +
                      +
                      +

                      Install Scylla Monitoring Stack

                      +

                      The following procedure uses a CentOS 7 based instance

                      +
                        +
                      1. Download the latest Scylla Monitoring Stack release.

                      2. +
                      +
                      wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.1.0.tar.gz
                      +
                      +
                      +
                        +
                      1. Open the tar

                      2. +
                      +

                      tar -xvf scylla-monitoring-*.tar.gz

                      +
                      +
                      +

                      Install Alertmanager

                      +

                      Tested with alertmanager 0.22.2 version

                      +
                        +
                      1. Install alertmanager

                      2. +
                      +
                      wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                      +tar -xvf alertmanager-*.linux-amd64.tar.gz
                      +
                      +
                      +
                        +
                      1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                      2. +
                      +

                      For example:

                      +
                      cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.1.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                      +
                      +
                      +
                        +
                      1. Start the Alertmanager

                      2. +
                      +

                      For example:

                      +
                      cd alertmanager-0.22.2.linux-amd64
                      +./alertmanager
                      +
                      +
                      +
                        +
                      1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                      2. +
                      +

                      For example:

                      +
                      http://192.168.135.166:9093/
                      +
                      +
                      +../_images/alertmanager.png +
                      +
                      +

                      Install Grafana Loki

                      +

                      Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                      +

                      We recomand using Loki with containers, but you can install it locally as described in Loki installation

                      +

                      You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                      +

                      Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                      +

                      Loki Related files

                      +

                      Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                      +
                      mkdir -p /etc/loki/rules
                      +mkdir -p /etc/loki/config
                      +cp loki/rules/* /etc/loki/rules
                      +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                      +
                      +
                      +

                      Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                      +

                      Promtail Related files

                      +

                      Promtail has a configuration file. You need to copy and modify the configuration.

                      +
                      mkdir -p /etc/promtail/
                      +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                      +
                      +
                      +

                      Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                      +
                      +
                      +

                      Install Prometheus

                      +

                      Tested with Prometheus version 2.27.1

                      +
                      +

                      Note

                      +

                      If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                      +
                      +
                        +
                      1. Install Prometheus

                      2. +
                      +
                      wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                      +tar -xvf prometheus-*.linux-amd64.tar.gz
                      +
                      +
                      +
                        +
                      1. Create Data and Config directories

                      2. +
                      +
                      mkdir -p /prometheus/data
                      +mkdir -p /etc/prometheus/prom_rules/
                      +mkdir -p /etc/scylla.d/prometheus/
                      +
                      +
                      +
                        +
                      1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                      2. +
                      +

                      Copy prometheus/prometheus.yml.template to prometheus.yml

                      +

                      For example:

                      +
                      cp scylla-monitoring-scylla-monitoring-4.1.0/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                      +cp scylla-monitoring-scylla-monitoring-4.1.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                      +
                      +
                      +
                        +
                      1. Edit the prometheus.yml file to point to the correct static data sources.

                      2. +
                      +
                      +

                      Note

                      +

                      Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                      +
                      +
                      vi /etc/prometheus/prometheus.yml
                      +
                      +
                      +

                      Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                      +

                      For example if the alertmanager will run on the same host:

                      +
                      alerting:
                      +   alertmanagers:
                      +   - static_configs:
                      +       - targets:
                      +           - 127.0.0.1:9093
                      +
                      +
                      +

                      Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                      +

                      For example the scrape config for Scylla:

                      +
                      global:
                      +  scrape_interval: 5s # By default, scrape targets every 5 second.
                      +  scrape_timeout: 4s # Timeout before trying to scape a target again
                      +
                      +  # Attach these labels to any time series or alerts when communicating with
                      +  # external systems (federation, remote storage, Alertmanager).
                      +  external_labels:
                      +    monitor: 'scylla-monitor'
                      +
                      +scrape_configs:
                      +- job_name: scylla
                      +  honor_labels: false
                      +  file_sd_configs:
                      +    - files:
                      +      - /etc/scylla.d/prometheus/scylla_servers.yml
                      +  relabel_configs:
                      +    - source_labels: [__address__]
                      +      regex:  '([^:]+)'
                      +      target_label: __address__
                      +      replacement: '${1}:9180'
                      +
                      +    - source_labels: [__address__]
                      +      regex:  '(.*):.+'
                      +      target_label: instance
                      +      replacement: '${1}'
                      +
                      +
                      +
                        +
                      1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                      2. +
                      +
                      +

                      Note

                      +

                      There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                      +
                      +

                      An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                      +
                      +

                      Note

                      +

                      You must have both files even if you are not using Scylla Manager

                      +
                      +

                      Add the labels for the cluster and data-center

                      +

                      scylla_servers.yml:

                      +

                      For example:

                      +
                      cat scylla_servers.yml
                      +# List Scylla end points
                      +
                      +- targets:
                      +  - 192.168.66.6
                      +  - 192.168.66.244
                      +  labels:
                      +    cluster: cluster1
                      +    dc: dc1
                      +- targets:
                      +    - 172.17.0.3
                      +  labels:
                      +    cluster: cluster1
                      +    dc: dc2
                      +
                      +
                      +
                      +

                      Note

                      +

                      See the previous note about deprecating the node_exporter_servers.yml file.

                      +
                      +

                      scylla_manager_server.yml

                      +

                      For example:

                      +
                      - targets:
                      +  - 127.0.0.1:5090
                      +
                      +
                      +
                        +
                      1. Start Prometheus server:

                      2. +
                      +

                      For example:

                      +
                      cd scylla-monitoring-scylla-monitoring-4.1.0/
                      +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                      +
                      +
                      +

                      Data should start accumulate on: /prometheus/data

                      +
                        +
                      1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                      2. +
                      +

                      For example:

                      +
                      http://192.168.135.166:9090/
                      +
                      +
                      +../_images/1.png +

                      Prometheus console should be visible

                      +
                        +
                      1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                      2. +
                      +

                      For example:

                      +

                      node_memory_MemFree

                      +../_images/2.png +

                      And

                      +

                      scylla_reactor_utilization

                      +../_images/3.png +

                      At this point Scylla is emitting the metrics and Prometheus is able to store them.

                      +
                      +
                      +

                      Install Grafana

                      +

                      Tested with Grafna 7.5.7

                      +
                        +
                      1. Install Grafana based on the instructions here

                      2. +
                      +

                      Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                      +
                        +
                      1. Access Scylla-Grafana-monitoring directory

                      2. +
                      +
                      cd scylla-monitoring-scylla-monitoring-4.1.0/
                      +
                      +
                      +
                        +
                      1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                      2. +
                      +
                      sudo cp -r grafana/plugins /var/lib/grafana/
                      +
                      +
                      +

                      If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                      +

                      For example:

                      +
                      cp -r grafana/plugins ../grafana-7.5.7/public/app
                      +
                      +
                      +
                        +
                      1. Provision the Dashboards

                      2. +
                      +

                      For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                      +

                      For Grafana installed with yum install

                      +
                      sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                      +sudo mkdir -p /var/lib/grafana/dashboards
                      +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                      +
                      +
                      +

                      For Grafana installed from packages

                      +
                      cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                      +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                      +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                      +
                      +
                      +

                      Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                      +
                      +

                      Note

                      +

                      A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                      +
                      +
                        +
                      1. Set the data source by copy datasource.yml and edit it

                      2. +
                      +
                      sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                      +
                      +
                      +
                      +

                      Note

                      +

                      Scylla uses a plugin to read from some system tables see the section below about using it.

                      +
                      +

                      For Grafana installed from packages

                      +
                      cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                      +
                      +
                      +

                      You should set the Prometheus and the alertmanager IP and port.

                      +

                      For example

                      +
                      sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                      +apiVersion: 1
                      +datasources:
                      + - name: prometheus
                      +   type: prometheus
                      +   url: http://192.168.135.167:9090
                      +   access: proxy
                      +   basicAuth: false
                      +
                      + - name: alertmanager
                      +   type: camptocamp-prometheus-alertmanager-datasource
                      +   orgId: 1
                      +   typeLogoUrl: public/img/icn-datasource.svg
                      +   access: proxy
                      +   url: http://192.168.135.166:9093
                      +   password:
                      +   user:
                      +   database:
                      +   basicAuth:
                      +   isDefault:
                      +   jsonData:
                      +     severity_critical: '4'
                      +     severity_high: '3'
                      +     severity_warning: '2'
                      +     severity_info: '1'
                      +
                      +
                      +
                        +
                      1. Start the Grafana service

                      2. +
                      +

                      For Grafana installed with yum install

                      +

                      sudo service grafana-server start

                      +

                      For Grafana installed from packages:

                      +

                      cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                      +

                      Edit scylla.ini to reflect the right paths in the paths section of the file.

                      +
                      plugins = /home/centos/grafana-7.5.7/data/plugins
                      +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                      +
                      +
                      +

                      Start the server:

                      +
                      cd /home/centos/grafana-7.5.7/
                      +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                      +
                      +
                      +
                        +
                      1. Make sure Grafana is running

                      2. +
                      +

                      Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                      +../_images/grafana.png +
                      +
                      +

                      Using Scylla Plugin with Grafana

                      +

                      Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                      +

                      Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                      +
                      +

                      Setting a monitoring user

                      +

                      This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                      +
                        +
                      • If you have not done so, enable authorization first.

                      • +
                      • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                      • +
                      • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                      • +
                      +
                      +
                      +

                      Installing the Plugin

                      +

                      Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                      +
                      +
                      +

                      Configure the Plugin

                      +

                      Add an entry to the datasource.yml file

                      +
                      - name: scylla-datasource
                      +  type: scylladb-scylla-datasource
                      +  orgId: 1
                      +  isDefault:
                      +  jsonData:
                      +  host: ''
                      +#  secureJsonData:
                      +#    user: 'scylla_monitoring'
                      +#    password: 'scylla_monitoring'
                      +
                      +
                      +

                      As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                      +
                      +
                      +

                      Enable the Plugin

                      +

                      Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                      +

                      See more about it the Grafana configurtion.

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/monitoring_stack.html b/branch-4.1/install/monitoring_stack.html new file mode 100644 index 000000000..8e7b179f6 --- /dev/null +++ b/branch-4.1/install/monitoring_stack.html @@ -0,0 +1,1038 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Install Scylla Monitoring Stack

                      +

                      This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

                      +

                      The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                      +

                      For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                      +
                      +

                      Minimal Production System Recommendations

                      +
                        +
                      • CPU - at least 2 physical cores/ 4vCPUs

                      • +
                      • Memory - 15GB+ DRAM and proportional to the number of cores.

                      • +
                      • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                      • +
                      • Network - 1GbE/10GbE preferred

                      • +
                      +
                      +

                      Calculating Prometheus Minimal Disk Space requirement

                      +

                      Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                      +

                      Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                      +

                      For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                      +
                      6 * 16 * 15 * 12MB ~ 16GB
                      +
                      +
                      +

                      To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                      +
                      +
                      +

                      Calculating Prometheus Minimal Memory Space requirement

                      +

                      Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                      +

                      For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                      +
                      +
                      +
                      +

                      Prerequisites

                      +
                        +
                      • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                      • +
                      • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                      • +
                      + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      Scylla Monitoring Stack Compatibility Matrix

                      Scylla Monitoring Stack Version

                      Prometheus Version

                      Grafana Version

                      4.1

                      2.38.0

                      9.1.0

                      4.0

                      2.34.0

                      8.5.2

                      3.11

                      2.32.0

                      8.3.4

                      3.10

                      2.32.0

                      8.3.3

                      3.9.2

                      2.29.1

                      8.2.7

                      3.9

                      2.29.1

                      8.1.1

                      3.8

                      2.27.1

                      7.5.7

                      3.7

                      2.25.2

                      7.4.0

                      3.6

                      2.18.1

                      7.3.5

                      3.5

                      2.18.1

                      7.1.5

                      3.4

                      2.18.1

                      6.7.3

                      +
                      +
                      +

                      Docker Post Installation

                      +

                      Docker post installation guide can be found here

                      +
                      +

                      Note

                      +

                      Avoid running the container as root.

                      +
                      +

                      To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                      +
                        +
                      1. Create the Docker group.

                      2. +
                      +
                      sudo groupadd docker
                      +
                      +
                      +
                        +
                      1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                      2. +
                      +
                      sudo usermod -aG docker $USER
                      +
                      +
                      +
                        +
                      1. Start Docker by calling:

                      2. +
                      +
                      sudo systemctl enable docker
                      +
                      +
                      +
                      +
                      +

                      Install Scylla Monitoring Stack

                      +

                      Procedure

                      +
                        +
                      1. Download and extract the latest Scylla Monitoring Stack binary;.

                      2. +
                      +
                      wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.1.0.tar.gz
                      +tar -xvf scylla-monitoring-4.1.0.tar.gz
                      +cd scylla-monitoring-scylla-monitoring-4.1.0
                      +
                      +
                      +

                      As an alternative, you can clone and use the Git repository directly.

                      +
                      git clone https://github.com/scylladb/scylla-monitoring.git
                      +cd scylla-monitoring
                      +git checkout branch-4.1
                      +
                      +
                      +
                        +
                      1. Start Docker service if needed

                      2. +
                      +
                      sudo systemctl restart docker
                      +
                      +
                      +
                      +
                      +

                      Configure Scylla Monitoring Stack

                      +

                      To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                      +

                      This configuration can be done from files, or using the Consul api.

                      +

                      Scylla Manager 2.0 and higher supports the Consul API.

                      +
                      +

                      Configure Scylla nodes from files

                      +
                        +
                      1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                      2. +
                      +
                      +

                      Note

                      +

                      It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                      +
                      +

                      For example:

                      +
                      - targets:
                      +      - 172.17.0.2
                      +      - 172.17.0.3
                      +  labels:
                      +      cluster: cluster1
                      +      dc: dc1
                      +
                      +
                      +
                      +

                      Note

                      +

                      If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                      +
                      +

                      Using IPV6

                      +

                      To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                      +

                      For example:

                      +
                      - targets:
                      +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                      +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                      +  labels:
                      +      cluster: cluster1
                      +      dc: dc1
                      +
                      +
                      +
                      +

                      Note

                      +

                      For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                      +
                      +

                      For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                      +
                      +

                      Note

                      +

                      By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                      +
                      +

                      If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                      +

                      For example:

                      +
                      ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                      +
                      +
                      +

                      Mark the different Data Centers with Labels.

                      +

                      As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                      +

                      You can use the genconfig.py script to generate the server file. For example:

                      +
                      ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                      +
                      +
                      +

                      This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                      +

                      OR

                      +

                      The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                      +
                      nodetool status | ./genconfig.py -NS
                      +
                      +
                      +

                      2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                      +

                      You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                      +

                      For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                      +
                      # List Scylla Manager end points
                      +
                      +- targets:
                      +  - 172.17.0.7:5090
                      +
                      +
                      +

                      Note that you do not need to add labels to the Scylla Manager targets.

                      +
                      +
                      +

                      Configure Scylla nodes using Scylla-Manager Consul API

                      +

                      Scylla Manager 2.0 has a Consul like API.

                      +

                      When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                      +

                      For example:

                      +
                      ./start-all.sh -L 10.10.0.1
                      +
                      +
                      +
                      +

                      Note

                      +

                      If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                      +
                      +
                      +
                      +

                      Connecting Scylla-Monitoring to Scylla

                      +

                      Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                      +

                      You can limit the user to read only, currently it only read table from the system keyspace.

                      +

                      To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                      +

                      Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                      +
                      +
                      +

                      Use an external directory for the Prometheus data directory

                      +

                      The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                      +
                      +

                      Note

                      +

                      Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                      +
                      +

                      If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                      +

                      In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                      +
                      +
                      +

                      Add Additional Prometheus Targets

                      +

                      There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                      +

                      The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                      +

                      You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                      +
                      - job_name: 'myservice'
                      +  # Override the global default and scrape targets from this job every 5 seconds.
                      +  scrape_interval: 5s
                      +  static_configs:
                      +    - targets:
                      +      - 17.0.0.1:7000
                      +
                      +
                      +
                      +
                      +
                      +

                      Start and Stop Scylla Monitoring Stack

                      +
                      +

                      Start

                      +
                      ./start-all.sh -d prometheus_data
                      +
                      +
                      +
                      +
                      +

                      Stop

                      +
                      ./kill-all.sh
                      +
                      +
                      +
                      +
                      +

                      Start a Specific Scylla Monitoring Stack Version

                      +

                      By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                      +

                      You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                      +

                      Multiple versions are supported. For example:

                      +
                      ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                      +
                      +
                      +

                      will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                      +
                      +
                      +

                      Accessing the localhost

                      +

                      The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                      +
                      ./start-all.sh -l -d prometheus-data
                      +
                      +
                      +
                      +
                      +

                      Configure rsyslog on each Scylla node

                      +

                      generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                      +

                      Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                      +

                      Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                      +

                      If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                      +
                      if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                      +
                      +
                      +

                      Restart rsyslog for the configuration to take effect.

                      +
                      systemctl restart rsyslog
                      +
                      +
                      +
                      +
                      +
                      +

                      View Grafana Dashboards

                      +

                      Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/start_all.html b/branch-4.1/install/start_all.html new file mode 100644 index 000000000..ad977e163 --- /dev/null +++ b/branch-4.1/install/start_all.html @@ -0,0 +1,750 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      The start-all.sh Command

                      +

                      Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                      +

                      The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                      +
                      +

                      General Options

                      +

                      -h Help, Print the help, and exit.

                      +

                      –version print the current Scylla-Monitoring stack version, and exit.

                      +

                      -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                      +

                      -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                      +

                      -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                      +

                      –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                      +
                      + + +
                      +

                      Alert Manager

                      +

                      The Alertmanager handles the alerts and takes the following parameters:

                      +

                      -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                      +

                      -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                      +

                      -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/install/thanos.html b/branch-4.1/install/thanos.html new file mode 100644 index 000000000..84b87dba4 --- /dev/null +++ b/branch-4.1/install/thanos.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Using Thanos as Data Source With Scylla Monitoring Stack

                      +

                      Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                      +
                        +
                      • High-availability.

                      • +
                      • Horizontal scaling.

                      • +
                      • Backup.

                      • +
                      +

                      The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                      +

                      The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                      +
                      +

                      Using Thanos As a Prometheus Aggregator

                      +

                      There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                      +
                      +

                      Prometheus Configuration

                      +

                      We will assume you have two Prometheus servers running.

                      +
                        +
                      1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                      2. +
                      3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                      4. +
                      +
                      +
                      +

                      Thanos sidecar

                      +

                      The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                      +
                      docker run -d \
                      + -v /path/to/prom/dir:/data/prom:z \
                      + -i --name sidecar thanosio/thanos \
                      + sidecar \
                      + --grpc-address=0.0.0.0:10911 \
                      + --grpc-grace-period=1s \
                      + --http-address=0.0.0.0:10912 \
                      + --http-grace-period=1s \
                      + --prometheus.url=http://prometheus-ip:9090 \
                      + --tsdb.path=/data/prom \
                      + -p 10912:10912 \
                      + -p 10911:10911
                      +
                      +
                      +

                      After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                      +
                      +
                      +

                      Thanos query

                      +

                      Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                      +
                      docker run -d \
                      + --name thanos -- thanosio/thanos \
                      +   query \
                      +   --debug.name=query0 \
                      +   --log.level=debug \
                      +   --grpc-address=0.0.0.0:10903 \
                      +   --grpc-grace-period=1s \
                      +   --http-address=0.0.0.0:10904 \
                      +   --http-grace-period=1s \
                      +   --query.replica-label=prometheus \
                      +   --store={ip1}:10911 --store={ip2}:10911
                      +
                      +
                      +

                      After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                      +
                      +
                      +

                      Update Scylla Data source

                      +

                      The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                      +

                      The file you edit is a template file that replaces the file Grafana uses, next time you start.

                      +

                      Restart the Scylla Monitoring Stack it should now use Thanos.

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/intro.html b/branch-4.1/intro.html new file mode 100644 index 000000000..c1e60b167 --- /dev/null +++ b/branch-4.1/intro.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      ScyllaDB Monitoring Stack

                      +

                      ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                      +_images/monitor.png +

                      The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                      +
                        +
                      • prometheus - Collects and stores metrics

                      • +
                      • grafan-loki - Parses logs and generates metrics and alerts

                      • +
                      • alertmanager - Handles alerts

                      • +
                      • grafana - Dashboards server

                      • +
                      +

                      A few optional components are used for additional services

                      +
                        +
                      • grafana-image-renderer - Allows you to download a dashboard as an image.

                      • +
                      • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                      • +
                      +
                      +

                      High Level Architecture

                      +_images/monitoring_stack1.png +

                      We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                      +

                      We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                      +

                      The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                      +

                      We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                      +

                      Choose a topic to get started:

                      + +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/objects.inv b/branch-4.1/objects.inv new file mode 100644 index 000000000..4824b5791 Binary files /dev/null and b/branch-4.1/objects.inv differ diff --git a/branch-4.1/procedures/alerts/alerting.html b/branch-4.1/procedures/alerts/alerting.html new file mode 100644 index 000000000..1576979da --- /dev/null +++ b/branch-4.1/procedures/alerts/alerting.html @@ -0,0 +1,749 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Alerting

                      +

                      Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                      +

                      You can read more about Prometheus alerting here

                      +

                      By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                      +

                      In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                      +

                      The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                      +../../_images/monitoring_stack.png +
                      +

                      Prometheus Alerts

                      +

                      The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                      +

                      Each alert consists of:

                      +
                        +
                      • Name

                      • +
                      • What happened

                      • +
                      • For how long

                      • +
                      • What to report

                      • +
                      +

                      For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                      +
                      - alert: InstanceDown
                      +  expr: up == 0
                      +  for: 60s
                      +  labels:
                      +    severity: "2"
                      +  annotations:
                      +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                      +    summary: Instance {{ $labels.instance }} down
                      +
                      +
                      +

                      The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                      +

                      The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                      +

                      The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                      +

                      annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                      +
                      +
                      +

                      Alertmanager

                      +

                      The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                      +

                      The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                      +
                        +
                      • Routes: Represent a routing tree, the most specific rule, wins

                      • +
                      • Inhibition: Mute an alert, based on another alert

                      • +
                      • Receiver: Send a notification via email, sluck, etc’

                      • +
                      +

                      Check the Alertmanager documentation for details on how to specify a specific receiver.

                      +

                      In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                      +
                      +
                      +

                      Tips When Adding an Alert

                      +

                      It’s worse having an alert that does not work, than not having an alert at all

                      +

                      There are multiple ways you can use to make sure your alert is set correctly:

                      +
                        +
                      • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                      • +
                      • Force the alert to be active by reducing the limits or the duration.

                      • +
                      • When possible simulate the actual scenario and see that the alert works as expected.

                      • +
                      +

                      For example, low available disk space.

                      +

                      Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                      +

                      Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                      +

                      Starting with a simple working expression helps you bisect problems.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/procedures/alerts/index.html b/branch-4.1/procedures/alerts/index.html new file mode 100644 index 000000000..c7b08af30 --- /dev/null +++ b/branch-4.1/procedures/alerts/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Alert Manager

                      +
                      +
                      +

                      Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/procedures/datadog/index.html b/branch-4.1/procedures/datadog/index.html new file mode 100644 index 000000000..5526d252e --- /dev/null +++ b/branch-4.1/procedures/datadog/index.html @@ -0,0 +1,734 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Datadog Integration

                      +

                      The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                      +
                        +
                      1. Installing and configuring the Datadog Agent.

                      2. +
                      3. Loading Scylla dashboard to Datadog.

                      4. +
                      5. Optionally load Monitor (Alerts).

                      6. +
                      +
                      +

                      Note

                      +

                      Scylla Cloud users, use and update the proper configuration file.

                      +
                      +
                      +

                      Install And configure the Datadog Agent

                      +

                      Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                      +

                      Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                      +
                      +

                      Scylla Cloud Users

                      +

                      Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                      +

                      Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                      +
                      +
                      +

                      Other Scylla Users

                      +

                      Other Scylla users, download the configuration file conf.yaml and replace the ip address of the promemtheus server.

                      +
                      +
                      +

                      Post configuration

                      +

                      Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                      +
                      +
                      +
                      +

                      Upload the Dashboard

                      +

                      Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                      +
                      +
                      +

                      Using the Dashboard

                      +

                      We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                      +../../_images/datadog.png +

                      The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                      +
                      +

                      Note

                      +

                      Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                      +
                      +
                      +
                      +

                      Adding Monitor

                      +

                      Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/procedures/index.html b/branch-4.1/procedures/index.html new file mode 100644 index 000000000..8079aed7d --- /dev/null +++ b/branch-4.1/procedures/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      ScyllaDB Monitoring Stack Procedures

                      +
                      +
                      +

                      There are several reference guides available which give additional information. Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/procedures/updating_dashboard.html b/branch-4.1/procedures/updating_dashboard.html new file mode 100644 index 000000000..e1ba4df75 --- /dev/null +++ b/branch-4.1/procedures/updating_dashboard.html @@ -0,0 +1,958 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Adding and Modifying Dashboards

                      +

                      This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                      +

                      It covers dashboard templates and how to modify them.

                      + +
                      +

                      General Limitations

                      +

                      Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                      +
                      +

                      Consistency Between Restarts

                      +

                      By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                      +
                      +
                      +

                      Consistency Between Upgrades

                      +

                      As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                      +
                      +

                      Note

                      +

                       You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                      +
                      +

                      At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                      +
                      +
                      +
                      +

                      Using Templated Dashboards

                      +

                      Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                      +

                      Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                      +

                      For example a typical graph panel would look like this:

                      +
                      {
                      +    "aliasColors": {},
                      +    "bars": false,
                      +    "datasource": "prometheus",
                      +    "editable": true,
                      +    "error": false,
                      +    "fill": 0,
                      +    "grid": {
                      +        "threshold1": null,
                      +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                      +        "threshold2": null,
                      +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                      +    },
                      +    "gridPos": {
                      +        "h": 6,
                      +        "w": 10,
                      +        "x": 0,
                      +        "y": 4
                      +    },
                      +    "id": 2,
                      +    "isNew": true,
                      +    "legend": {
                      +        "avg": false,
                      +        "current": false,
                      +        "max": false,
                      +        "min": false,
                      +        "show": false,
                      +        "total": false,
                      +        "values": false
                      +    },
                      +    "lines": true,
                      +    "linewidth": 2,
                      +    "links": [],
                      +    "nullPointMode": "connected",
                      +    "percentage": false,
                      +    "pointradius": 5,
                      +    "points": false,
                      +    "renderer": "flot",
                      +    "seriesOverrides": [
                      +        {}
                      +    ],
                      +    "span": 5,
                      +    "stack": false,
                      +    "steppedLine": false,
                      +    "targets": [
                      +        {
                      +            "expr": "sum(node_filesystem_avail) by (instance)",
                      +            "intervalFactor": 1,
                      +            "legendFormat": "",
                      +            "refId": "A",
                      +            "step": 1
                      +        }
                      +    ],
                      +    "timeFrom": null,
                      +    "timeShift": null,
                      +    "title": "Available Disk Size",
                      +    "tooltip": {
                      +        "msResolution": false,
                      +        "shared": true,
                      +        "sort": 0,
                      +        "value_type": "cumulative"
                      +    },
                      +    "transparent": false,
                      +    "type": "graph",
                      +    "xaxis": {
                      +        "show": true
                      +    },
                      +    "yaxes": [
                      +        {
                      +            "format": "percent",
                      +            "logBase": 1,
                      +            "max": 101,
                      +            "min": 0,
                      +            "show": true
                      +        },
                      +        {
                      +            "format": "short",
                      +            "logBase": 1,
                      +            "max": null,
                      +            "min": null,
                      +            "show": true
                      +        }
                      +    ]
                      +}
                      +
                      +
                      +

                      As you can imagine, most panels would have similar values.

                      +

                      To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                      +
                      +

                      The Template Class System

                      +

                      The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                      +

                      The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                      +

                      In the template file, you can also add or override attributes.

                      +

                      The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                      +

                      When generating dashboards, each class will be replaced by its definition.

                      +

                      For example, a row in the type.json is defined as:

                      +
                      {
                      + "base_row": {
                      +     "collapse": false,
                      +     "editable": true
                      + },
                      + "row": {
                      +     "class": "base_row",
                      +     "height": "250px"
                      + }
                      + }
                      +
                      +
                      +

                      Will be used like in a template:

                      +
                      {
                      +     "class": "row",
                      +     "height": "150px",
                      +     "panels": [
                      +     ]
                      +}
                      +
                      +
                      +

                      And the output will be:

                      +
                      {
                      +     "class": "row",
                      +     "collapse": false,
                      +     "editable": true,
                      +     "height": "150px",
                      +     "panels": [
                      +
                      +     ]
                      +}
                      +
                      +
                      +

                      We can see that the template added the panels attribute and that it overrides the height attribute.

                      +
                      +
                      +

                      Panel Example

                      +

                      Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                      +
                      {
                      +     "class": "row",
                      +     "panels": [
                      +         {
                      +             "class": "bytes_panel",
                      +             "span": 3,
                      +             "targets": [
                      +                 {
                      +                     "expr": "sum(node_filesystem_avail) by (instance)",
                      +                     "intervalFactor": 1,
                      +                     "legendFormat": "",
                      +                     "metric": "",
                      +                     "refId": "A",
                      +                     "step": 1
                      +                 }
                      +             ],
                      +             "title": "Available Disk Size"
                      +         }
                      +     ]
                      +}
                      +
                      +
                      +

                      In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                      +

                      You can also see that the span attribute is overridden to set the panel size.

                      +

                      To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                      +
                      +
                      +

                      Grafana Formats and Layouts

                      +

                      The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                      +

                      Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                      +

                      The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                      +

                      To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                      +

                      The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                      +

                      You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                      +

                      gridPos has the following attributes:

                      +
                      {
                      +   "x": 0,
                      +   "y": 0,
                      +   "w": 24,
                      +   "h": 4
                      + }
                      +
                      +
                      +

                      When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                      +
                      {
                      +   "gridPos": {
                      +      "h": 2
                      +    }
                      +}
                      +
                      +
                      +
                      +
                      +

                      Generating the dashboards from templates (generate-dashboards.sh)

                      +
                      +

                      Prerequisite

                      +

                      Python 2.7

                      +

                      make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                      +

                      Use the -h flag to get help information.

                      +

                      You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                      +

                      When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                      +

                      For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                      +

                      .\generate-dashboards.sh -v 2020.1

                      +
                      +

                      Note

                      +

                      generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                      +
                      +
                      +
                      +
                      +

                      Validation

                      +

                      After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                      +

                      Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/reference/index.html b/branch-4.1/reference/index.html new file mode 100644 index 000000000..407cfed35 --- /dev/null +++ b/branch-4.1/reference/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Reference Guide

                      +
                      +
                      +

                      There are several reference guides available which give additional information. Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/reference/matrix.html b/branch-4.1/reference/matrix.html new file mode 100644 index 000000000..2a831a997 --- /dev/null +++ b/branch-4.1/reference/matrix.html @@ -0,0 +1,818 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Support Matrix

                      +

                      The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                      + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                      Scylla Monitoring Stack Version

                      Scylla Open Source Version

                      Scylla Enterprise Version

                      Node_exporter[1] Version

                      Scylla Manager Version

                      4.1

                      4.5,4.6,5.0,5.1

                      2020.1, 2021.1, 2022.1, 2022.2

                      0.17

                      2.5, 2.6, 3.0

                      4.0

                      4.3, 4.4, 4.5, 4.6, 5.0

                      2020.1, 2021.1, 2022.1

                      0.17

                      2.3, 2.4, 2.5, 2.6, 3.0

                      3.11

                      4.3, 4.4, 4.5, 4.6, 5.0

                      2020.1, 2021.1, 2022.2

                      0.17

                      2.3, 2.4, 2.5, 2.6

                      3.10

                      4.3, 4.4, 4.5, 4.6

                      2020.1, 2021.1

                      0.17

                      2.3, 2.4, 2.5, 2.6

                      3.9

                      4.3, 4.4, 4.5, 4.6

                      2020.1, 2021.1

                      0.17

                      2.3, 2.4, 2.5

                      3.8

                      4.3, 4.4, 4.5

                      2020.1, 2021.1

                      0.17

                      2.3, 2.4, 2.5

                      3.7

                      4.2, 4.3, 4.4

                      2019.1, 2020.1, 2021.1

                      0.17

                      2.2, 2.3

                      3.6.3

                      4.2, 4.3, 4.4

                      2019.1, 2020.1, 2021.1

                      0.17

                      2.2, 2.3, 2.1

                      3.6

                      4.1, 4.2, 4.3

                      2019.1, 2020.1

                      0.17

                      2.1, 2.2, 2.3

                      3.6.1

                      4.1, 4.2, 4.3

                      2019.1, 2020.1

                      0.17

                      2.1, 2.2

                      3.6.1

                      4.1, 4.2, 4.3, 4.4

                      2019.1, 2020.1

                      0.17

                      2.1, 2.2

                      3.5

                      3.3, 4.0, 4.1, 4.2

                      2019.1, 2020.1

                      0.17

                      2.0, 2.1, 2.2

                      3.4.3

                      3.3, 4.0, 4.1, 4.2

                      2019.1, 2020.1

                      0.17

                      2.0, 2.1

                      3.4

                      3.3, 4.0, 4.1

                      2018.1, 2019.1

                      0.17

                      2.0, 2.1

                      3.3

                      3.1, 3.2, 3.3, 4.0

                      2018.1, 2019.1

                      0.17

                      1.4, 2.0, 2.1

                      3.2

                      3.1, 3.2, 3.3

                      2018.1, 2019.1

                      0.17

                      1.4, 2.0

                      3.1

                      2.3, 3.0, 3.1, 3.2

                      2018.1, 2019.1

                      0.17

                      1.3, 1.4, 2.0

                      3.0

                      2.3, 3.0, 3.1, 3.2

                      2018.1, 2019.1

                      0.17

                      1.3, 1.4

                      2.4

                      2.3, 3.0, 3.1

                      2018.1, 2019.1

                      0.14, 0.17

                      1.3, 1.4

                      2.3

                      2.3, 3.0

                      2018.1, 2019.1

                      0.14, 0.17

                      1.3

                      2.2

                      2.3, 3.0

                      2018.1, 2019.1

                      0.14, 0.17

                      1.3

                      2.1

                      2.3, 3.0

                      2018.1

                      0.14, 0.17

                      1.3

                      +

                      [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/reference/monitoring_apis.html b/branch-4.1/reference/monitoring_apis.html new file mode 100644 index 000000000..4a3109383 --- /dev/null +++ b/branch-4.1/reference/monitoring_apis.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Interfaces

                      +

                      Scylla exposes two interfaces for online monitoring, as described below

                      +
                      +

                      Prometheus

                      +

                      By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                      +

                      For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                      +

                      You can change the Prometheus listening address and port in scylla.yaml file

                      +
                      # prometheus port
                      +# By default, Scylla opens prometheus API port on port 9180
                      +# setting the port to 0 will disable the prometheus API.
                      +prometheus_port: 9180
                      +#
                      +# prometheus address
                      +# By default, Scylla binds all interfaces to the prometheus API
                      +# It is possible to restrict the listening address to a specific one
                      +prometheus_address: 0.0.0.0
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/robots.txt b/branch-4.1/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.1/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.1/search.html b/branch-4.1/search.html new file mode 100644 index 000000000..5e7ac0fa5 --- /dev/null +++ b/branch-4.1/search.html @@ -0,0 +1,643 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + + + +
                      + + + + + +
                      + + +
                      + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/searchindex.js b/branch-4.1/searchindex.js new file mode 100644 index 000000000..c3784a9fb --- /dev/null +++ b/branch-4.1/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 5, 6, 22, 24, 25, 29, 30, 32, 33, 35, 37, 38], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 26, 27, 28, 29, 32, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 26], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 29, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 27, 28, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 26, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 27, 34, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 33], "user": [1, 2, 6, 7, 9, 26, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9, 32], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 28, 29], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 26, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 19, 21, 22, 23, 24, 25, 29, 31, 33, 34, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 29, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 26, 30, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 31, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 27, 30, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 26, 29, 32, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 14, 19, 21, 22, 23, 24, 25], "onc": [2, 12, 21, 25, 31, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 19, 21, 22, 23, 24, 25, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 34, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 32, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 30, 31, 32, 38, 41], "one": [2, 6, 7, 17, 21, 22, 23, 24, 25, 27, 29, 30, 33, 34, 35, 41], "both": [2, 5, 6, 19, 22, 24, 25, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 26, 39, 41], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 19, 21, 22, 23, 24, 25, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 28, 33, 34, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 34, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 22, 24, 25, 27, 33, 34, 41], "advis": [2, 34], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25], "databas": [2, 5, 7, 21, 29, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 33, 41], "below": [2, 5, 6, 10, 14, 17], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 30, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 19, 21, 22, 23, 24, 25, 26, 32, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 32, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 31, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 6, 12, 17], "To": [2, 4, 5, 6, 14, 17, 21, 22, 23, 24, 25], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 27, 28, 29, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "21": 2, "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 25], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 14, 16], "3": [2, 4, 5, 6, 14, 16, 20, 35], "5": [2, 5, 6, 14, 16, 19], "3000": [2, 5, 6, 22, 24, 25], "1000": [2, 33], "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 14, 28, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25], "dir": [2, 7, 8, 22, 24, 25], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 10, 14, 16, 20, 24, 35], "3100": [2, 5], "rule": [2, 5, 7, 10, 25, 31, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 27, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 29, 34, 35, 37, 39, 41], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 21, 33, 39], "section": [4, 5, 6, 12, 19, 21, 24, 25, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 29, 35, 37, 41], "default": [4, 5, 6, 7, 10, 14, 17, 19, 21, 23, 25, 30, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 38], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 27, 28, 29, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 25, 32, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 27, 29, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 29, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 31, 39, 41], "need": [4, 5, 6, 7, 8, 14, 19, 25, 27, 28, 29, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 27, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 27, 34, 41], "out": [4, 5, 6, 8, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 26, 29, 41], "take": [4, 5, 6, 7, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "instruct": [5, 6, 22, 24, 25], "help": [5, 7, 10, 14, 41], "pleas": [5, 19], "most": [5, 10, 14, 25, 34, 36, 41], "current": [5, 6, 7, 10, 14, 19, 22, 24, 25], "common": [5, 7, 41], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 19], "standalon": 5, "thei": [5, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 27, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 27, 28, 35, 41], "support": [5, 6, 14, 15, 26, 32, 41], "want": [5, 6, 10, 22, 24, 25], "latest": [5, 6, 7, 22, 24, 25], "releas": [5, 21, 22, 23, 24, 25], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25], "http": [5, 6, 8, 19, 21, 22, 24, 25, 29, 30, 32, 38], "com": [5, 6, 22, 24, 25, 29, 30, 32, 38], "archiv": [5, 6, 22, 24, 25], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 21, 22, 23, 24], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25], "p": [5, 7, 8, 19, 21, 22, 24, 25], "home": 5, "cd": [5, 6, 22, 24, 25], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25], "browser": [5, 6, 8, 14, 19, 22, 24, 25], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 31, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 12, 19, 25, 26, 29, 30, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 27, 30, 31, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 29, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 14, 26, 27, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25], "scrap": 5, "job": [5, 6, 19], "onli": [5, 6, 7, 21, 23, 25, 29, 31, 33, 39, 41], "import": [5, 6, 7, 12, 21, 22, 24, 25, 33], "record": [5, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25], "prom_rul": [5, 25], "correct": [5, 23], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 32], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 34, 41], "typic": [5, 14, 25, 27, 29, 39, 41], "node_export": [5, 6, 7, 9, 16, 19], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 14, 17, 21, 23, 30, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 26, 31], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24], "scylla_reactor_util": 5, "At": [5, 14, 24, 25], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 6, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 27, 28, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 25, 34, 38], "tabl": [5, 6, 10, 16, 26, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 33, 34, 41], "give": [5, 13, 15], "strongli": 5, "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 26, 29, 34, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 31, 33], "mention": [5, 14], "previous": [5, 24, 25], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 30, 33, 41], "privileg": [5, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 25], "laptop": 6, "38": 6, "9": [6, 16, 25], "34": 6, "8": [6, 16, 21, 25], "11": [6, 16], "32": 6, "10": [6, 10, 14, 16], "29": 6, "25": [6, 19], "avoid": [6, 14, 19, 30, 32, 41], "root": [6, 19, 22, 24, 25], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 29, 41], "higher": [6, 25, 29, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 26, 27, 28], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25], "within": [6, 10, 14], "protect": 6, "assign": 6, "place": [6, 7, 8, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 27, 29, 30, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25], "2019": [6, 16, 38], "reach": [6, 8, 12, 29, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 29, 30, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 28, 31, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 29, 30, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 26, 27, 28, 29, 30, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 34], "disk": [7, 10, 14, 19, 26, 28, 34], "possibl": [7, 10, 17, 32, 41], "api": [7, 8, 17, 21], "resolv": 7, "explicitli": [7, 14], "request": [7, 17, 34, 40], "how": [7, 8, 10, 14, 22, 24, 25, 27, 28, 29, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14, 34], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 28], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 27, 28, 29, 34, 35, 41], "abov": [8, 22, 24, 25], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 29, 38, 41], "email": [9, 10], "slack": [9, 10], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11, 34], "wrong": [10, 11, 14, 19, 25, 39, 41], "shown": [10, 19, 22, 24, 25], "overview": [10, 25, 34], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 32, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 42], "annot": 10, "descript": [10, 34], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 41], "rout": [10, 29, 41], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 27], "simul": 10, "actual": [10, 37], "low": [10, 41], "space": 10, "lower": [10, 41], "fire": 10, "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 31, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "promemtheu": 12, "json": [12, 14], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "shard": [12, 25, 34], "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 19, 21], "explain": [14, 22, 24, 25, 34], "intern": [14, 29, 41], "potenti": [14, 34, 41], "issu": [14, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 34, 35, 37], "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 30, 41], "tooltip": 14, "msresolut": 14, "share": [14, 33], "sort": [14, 32, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 32, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 30, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 23, 25], "calcul": [14, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "24": [14, 25], "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": [14, 34], "usual": [14, 19, 34, 41], "easier": 14, "wrapper": 14, "re": [14, 29], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2018": [16, 30], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "56090": 19, "old": [19, 22, 23, 24, 25], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "non": [19, 21, 28, 29, 34, 38, 41], "post": 19, "past": [19, 23], "mai": [19, 33, 34, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": [19, 34], "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 29, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 26, 27, 28, 30, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "while": [19, 21, 22, 24, 25, 33], "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25], "migrat": [21, 22, 24], "lose": 21, "histor": [21, 25], "process": [21, 33, 40], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25], "3001": [21, 22, 24, 25], "9091": [21, 22, 24, 25], "9094": 21, "fail": [21, 27, 29, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25], "back": [21, 27], "recommend": [22, 24, 25], "uninstal": [22, 24, 25], "minor": [22, 24, 25], "9095": [22, 24, 25], "brows": [22, 24, 25], "satisfi": [22, 24, 25], "shut": [22, 24, 25], "caus": [22, 24, 25, 29, 41], "blackout": [22, 24, 25], "normal": [22, 24, 25], "dure": [22, 24, 25], "oper": [22, 24, 25, 34, 41], "complet": [22, 24, 25], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 34, 41], "newer": [24, 25], "ensur": 25, "patch": 25, "skip": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 28], "latenc": [25, 29, 33, 34, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 27], "mechan": [25, 27], "present": 25, "reli": [25, 41], "miss": 25, "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 27, 28, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "primari": [26, 41], "kei": [26, 32, 41], "scan": 26, "These": [26, 41], "kind": [26, 41], "bigger": 26, "care": [26, 27, 28, 41], "replicationfactor": [27, 28], "piec": 27, "determin": [27, 28, 35, 41], "repli": [27, 28, 30, 35, 37, 41], "unavail": [27, 41], "client": [27, 30, 34, 41], "respond": 27, "accompani": 27, "deep": 27, "understand": 27, "acknowledg": 28, "coordin": [28, 29, 35, 37, 41], "hint": 28, "fact": 28, "yet": 28, "ideal": [29, 41], "resourc": [29, 32, 41], "replic": [29, 35, 37, 41], "prepar": [29, 34, 38], "statement": [29, 31, 34, 38], "balanc": [29, 33, 34, 41], "polici": 29, "cours": 29, "intro": 29, "recap": 29, "ring": [29, 41], "architectur": 29, "chunk": [30, 41], "increas": [30, 33, 41], "overal": [30, 33, 41], "thu": 30, "www": [30, 38], "07": 30, "13": 30, "effici": [30, 41], "optim": [31, 38, 42], "concret": 31, "thumb": 31, "alwai": 31, "favor": 31, "partit": [32, 34], "BY": [32, 41], "ineffici": [32, 41], "consum": 32, "doc": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "practic": [34, 38], "solv": 34, "left": 34, "categori": [34, 41], "jump": 34, "warn": 34, "cell": 34, "model": [34, 38, 40, 41], "code": 34, "imbal": 34, "imbalanc": 34, "hot": 34, "bottleneck": [34, 38], "cach": 34, "hit": 34, "awar": 34, "order": [34, 41], "due": 34, "unsatisfi": 34, "faulti": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "explan": 38, "08": 38, "best": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "might": 39, "shed": 40, "drop": [40, 41], "repair": 40, "que": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "prevent": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "cost": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 9, 13], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 34, 42], "us": [2, 5, 6, 8, 12, 14, 26, 27, 28, 32, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 30, 38], "node": [6, 36], "from": [6, 14], "manag": [6, 7, 11, 19], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": 6, "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 34, 41], "all": [7, 22, 24, 25, 27], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 26, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 27, 28, 35, 41], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "upload": 12, "procedur": [13, 21, 22, 23, 24, 25], "modifi": 14, "limit": 14, "consist": [14, 27, 28, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25], "latest": 21, "new": [21, 22, 23, 24, 25], "rule": 21, "4": [21, 25], "move": [21, 22, 24, 25], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25], "link": [21, 22, 23, 24, 25, 28, 29, 30, 32, 38], "y": [22, 24, 25], "": [22, 24, 25], "i": [22, 24, 25, 36], "run": [22, 24, 25], "correct": [22, 24, 25], "correctli": [22, 24], "kill": [22, 24, 25], "node_export": 23, "test": [24, 25], "mode": [24, 25], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [26, 27, 28, 29, 30, 31, 32, 35, 37], "allow": [26, 41], "filter": [26, 41], "ani": 28, "univers": [28, 29], "ar": [29, 30, 31, 38], "token": [29, 41], "awar": [29, 41], "select": 30, "non": [30, 31], "page": [30, 41], "blog": [30, 38], "prepar": [31, 39, 41], "revers": [32, 41], "order": 32, "document": 32, "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Some SELECT queries are non-paged": [[30, "some-select-queries-are-non-paged"]], "Blog-post Links": [[30, "blog-post-links"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Some queries use reverse order": [[32, "some-queries-use-reverse-order"]], "Documentation link": [[32, "documentation-link"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some queries are non-prepared": [[31, "some-queries-are-non-prepared"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Upgrade Procedure": [[24, "upgrade-procedure"], [25, "upgrade-procedure"], [21, "upgrade-procedure"], [23, "upgrade-procedure"], [22, "upgrade-procedure"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Setting the server\u2019s files": [[24, "setting-the-server-s-files"], [25, "setting-the-server-s-files"], [22, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[24, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"], [22, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[24, "validate-the-version-installed-correctly"], [22, "validate-the-version-installed-correctly"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Kill all containers": [[24, "kill-all-containers"], [25, "kill-all-containers"], [22, "kill-all-containers"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Related Links": [[24, "related-links"], [25, "related-links"], [21, "related-links"], [23, "related-links"], [22, "related-links"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Some queries use ALLOW FILTERING": [[26, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[21, "install-the-new-monitoring-stack"], [23, "install-the-new-monitoring-stack"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Validate the upgrade": [[21, "validate-the-upgrade"], [23, "validate-the-upgrade"]], "Rollback": [[21, "rollback"], [23, "rollback"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Some queries use Consistency Level: ANY": [[28, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[28, "link-to-scylla-university"]], "Some queries use Consistency Level: ALL": [[27, "some-queries-use-consistency-level-all"]], "Some queries are not token-aware": [[29, "some-queries-are-not-token-aware"]], "University link": [[29, "university-link"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[17, "prometheus"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "System Overload": [[40, "system-overload"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "ScyllaDB Monitoring Stack": [[9, "scylladb-monitoring-stack"], [1, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.1/sitemap.xml b/branch-4.1/sitemap.xml new file mode 100644 index 000000000..37fa2e266 --- /dev/null +++ b/branch-4.1/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.1/troubleshooting/index.html b/branch-4.1/troubleshooting/index.html new file mode 100644 index 000000000..3e9b24381 --- /dev/null +++ b/branch-4.1/troubleshooting/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Troubleshooting Guide for Scylla Monitoring Stack

                      +
                      +
                      +

                      Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/troubleshooting/monitor_troubleshoot.html b/branch-4.1/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..5a5ccdc74 --- /dev/null +++ b/branch-4.1/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,861 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Troubleshoot Scylla Monitoring Stack

                      +

                      This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                      +
                      +

                      Problem

                      +
                      +

                      Scylla-Manager 2.2 with Duplicate information

                      +

                      Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                      +
                        +
                      • For Manager server: from 56090 to 5090

                      • +
                      • For Manager Agent: from 56090 to 5090

                      • +
                      +

                      For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                      +

                      However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                      +

                      The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                      +

                      Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                      +
                      +
                      +

                      A Container Fails To Start

                      +

                      When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                      +
                      Wait for Prometheus container to start........Error: Prometheus container failed to start
                      +
                      +
                      +

                      Should this happen, check the Docker logs for more information.

                      +
                      docker logs aprom
                      +
                      +
                      +

                      Usually the reason for the failure is described in the logs.

                      +
                      +
                      +

                      Files And Directory Permissions

                      +
                      +

                      Note

                      +

                      Avoid running Docker containers as root.

                      +
                      +

                      The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                      +

                      If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                      +
                      +

                      Note

                      +

                      If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                      +
                      +

                      For example if your Prometheus data directory is /prom-data and you are using centos user

                      +
                      ls -la /|grep prom-data
                      +
                      +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                      +
                      +sudo chown -R centos:centos /prom-data
                      +
                      +ls -la /|grep prom-data
                      +
                      +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                      +
                      +
                      +
                      +
                      +

                      No Data Points

                      +

                      No data points on all data charts.

                      +
                      +

                      Solution

                      +

                      If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                      +
                        +
                      1. Login to the Prometheus console:

                      2. +
                      3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                      4. +
                      5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                      6. +
                      +
                      +
                        +
                      • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                      • +
                      • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                      • +
                      • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                      • +
                      +
                      +

                      For example:

                      +
                      ./start-all.sh -v 3.1
                      +
                      +
                      +

                      More on start-all.sh options.

                      +
                      +
                      +
                      +

                      Grafana Chart Shows Error (!) Sign

                      +

                      Run this procedure on the Scylla Monitoring Stack server.

                      +

                      If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                      +
                      +

                      Solution

                      +

                      On the Scylla Monitoring Stack server:

                      +
                        +
                      1. Check Prometheus is running using docker ps.

                      2. +
                      +
                        +
                      • If it is not running check the prometheus.yml for errors.

                      • +
                      +

                      For example:

                      +
                      CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                      +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                      +
                      +
                      +
                        +
                      • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                      • +
                      +
                      +
                      +
                      +

                      Grafana Shows Server Level Metrics, but not Scylla Metrics

                      +

                      Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                      +
                      +

                      Solution

                      +
                        +
                      • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                      • +
                      +

                      For example

                      +
                      curl 172.17.0.2:9180/metrics
                      +
                      +
                      +
                      +
                      +
                      +

                      Grafana Shows Scylla Metrics, but not Server Level Metrics

                      +

                      Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                      +
                      +

                      Solution

                      +

                      1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                      +
                        +
                      1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                      2. +
                      +
                      +
                      +

                      Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                      +

                      While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                      +

                      If the node_exporter service is not starting it may need to be updated manually.

                      +

                      Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                      +
                      +
                      +
                      +

                      Working with Wireshark

                      +

                      No metrics shown in the Scylla Monitoring Stack.

                      +
                        +
                      1. Install wireshark

                      2. +
                      +

                      2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                      +

                      For example:

                      +
                      tshark -i eth0 -f "dst port 9180"
                      +
                      +
                      +

                      Capture from Scylla node towards Scylla Monitoring Stack server.

                      +

                      In this example, Scylla is running.

                      +
                      Monitor ip        Scylla node ip
                      +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                      +
                      +
                      +

                      In this example, Scylla is not running

                      +
                      Monitor ip        Scylla node ip
                      +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                      +
                      +
                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/index.html b/branch-4.1/upgrade/index.html new file mode 100644 index 000000000..3a1d2f23e --- /dev/null +++ b/branch-4.1/upgrade/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Scylla Monitoring Stack

                      +
                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..1280aa0b7 --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                      +

                      Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                      +
                      +

                      Upgrade Procedure

                      +
                      +

                      1. Upgrade to the latest 1.x version

                      +

                      Before starting the upgrade procedure, make sure you are running the latest 1.x version

                      +
                      +
                      +

                      2. Install the new monitoring stack

                      +
                        +
                      1. Download the 2.x version from the release page.

                      2. +
                      3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                      4. +
                      5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                        +
                          +
                        • scylla_servers.yml

                        • +
                        • scylla_manager_servers.yml

                        • +
                        • node_exporter_servers.yml

                        • +
                        +
                      6. +
                      7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                      8. +
                      +
                      ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                      +
                      +
                      +
                      +

                      Note

                      +

                      Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                      +
                      +

                      While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                      +
                      ./kill-all.sh -g 3001 -p 9091 -m 9094
                      +
                      +
                      +
                      +

                      Validation

                      +

                      Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                      +
                      +
                      +
                      +

                      3. Alerting Rules

                      +

                      Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                      +
                      +
                      +

                      4. Moving to Prometheus 2.x

                      +

                      Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                      +

                      Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                      +
                      +

                      a. Set the old system

                      +

                      The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                      +
                        +
                      • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                      • +
                      • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                      • +
                      +
                      +

                      Note

                      +

                      After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                      +
                      +
                      +
                      +

                      b. Set the new system

                      +

                      The following step will allow the new monitoring system to read historical metrics from the old system.

                      +
                        +
                      • In the Prometheus prometheus.yml.template file add the following at the end:

                      • +
                      +
                      remote_read:
                      +  - url: "http://{ip}:9111/api/v1/read"
                      +
                      +
                      +

                      Where {ip} is the ip of the old system.

                      +
                        +
                      • restart the new stack

                      • +
                      +
                      +
                      +
                      +

                      Validate the upgrade

                      +

                      You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                      +
                      +
                      +
                      +

                      Rollback

                      +

                      In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..c64e5bac8 --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                      +
                      +

                      Upgrade Procedure

                      +

                      We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                      +

                      Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                      +
                      +

                      Install 2.y (The new version)

                      +
                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                      +unzip scylla-monitoring-2.y.zip
                      +cd scylla-monitoring-scylla-monitoring-2.y/
                      +
                      +
                      +

                      Replace “y” with the new minor release number, for example, 2.1.zip

                      +
                      +
                      +

                      Setting the server’s files

                      +

                      Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                      +
                      cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                      +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                      +
                      +
                      +
                      +
                      +

                      Validate the new version is running the correct version

                      +

                      Starting from Scylla-Monitoring version 2.2, you can run:

                      +
                      ./start-all.sh --version
                      +
                      +
                      +

                      To validate the Scylla-Monitoring version.

                      +
                      +
                      +

                      Validate the version installed correctly

                      +

                      To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                      +
                      ./start-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      Browse to http://{ip}:9091 +And check the Grafana dashboard

                      +

                      Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                      +
                      +

                      Caution

                      +

                      Important: do not use the local dir flag when testing!

                      +
                      +

                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                      +
                      +

                      Caution

                      +

                      Important: Do not kill the 2.x version that is currently running.

                      +
                      +

                      Use the following command to kill the containers:

                      +
                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      You can start and stop the new 2.y version while testing.

                      +
                      +
                      +

                      Move to version 2.y (the new version)

                      +

                      Note: migrating will cause a few seconds of blackout in the system.

                      +

                      We assume that you are using external volume to store the metrics data.

                      +
                      +

                      Kill all containers

                      +

                      Follow the instruction on how to kill the 2.y version when in testing mode.

                      +

                      To kill the 2.x version containers, run:

                      +
                      ./kill-all.sh
                      +
                      +
                      +

                      Start version 2.y in normal mode

                      +

                      From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                      +
                      ./start-all.sh -d /path/to/data/dir
                      +
                      +
                      +

                      Point your browser to http://{ip}:3000 and see that the data is there.

                      +
                      +
                      +
                      +

                      Rollback to version 2.x

                      +

                      To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                      +

                      To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                      +
                      ./kill-all.sh
                      +cd /path/to/scylla-grafana-2.x/
                      +./start-all.sh -d /path/to/data/dir
                      +
                      +
                      +
                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..f860e4719 --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,752 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                      +

                      Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                      +
                      +

                      Upgrade Procedure

                      +
                      +

                      1. Validate node_exporter version

                      +

                      Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                      +

                      If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                      +
                      +
                      +

                      2. Install the new monitoring stack

                      +
                        +
                      1. Download the 3.x version from the release page.

                      2. +
                      3. Unzip it into a different directory.

                      4. +
                      5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                        +
                          +
                        • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                        • +
                        • scylla_manager_servers.yml

                        • +
                        +
                        +
                        +

                        Note

                        +

                        The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                        +
                        +
                        +
                      6. +
                      7. Stop the old monitoring stack

                        +
                        +
                        ./kill-all.sh
                        +
                        +
                        +
                        +
                      8. +
                      9. Start the new monitoring stack

                        +
                        +
                        ./start-all.sh -d /prometheus-data-path
                        +
                        +
                        +
                        +
                      10. +
                      +
                      +
                      +

                      Validate the upgrade

                      +

                      You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                      +

                      Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                      +
                      +
                      +
                      +

                      Rollback

                      +

                      To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..d75352f76 --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                      +
                      +

                      Upgrade Procedure

                      +

                      We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                      +

                      Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                      +
                      +

                      Install 3.y (The new version)

                      +
                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                      +unzip scylla-monitoring-3.y.zip
                      +cd scylla-monitoring-scylla-monitoring-3.y/
                      +
                      +
                      +

                      Replace “y” with the new minor release number, for example, 3.0.1.zip

                      +
                      +
                      +

                      Setting the server’s files

                      +

                      Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                      +
                      cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                      +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                      +
                      +
                      +
                      +
                      +

                      Validate the new version is running the correct version

                      +

                      Starting from Scylla-Monitoring version 2.2, you can run:

                      +
                      ./start-all.sh --version
                      +
                      +
                      +

                      To validate the Scylla-Monitoring version.

                      +
                      +
                      +

                      Validate the version installed correctly

                      +

                      To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                      +
                      ./start-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      Browse to http://{ip}:9091 +And check the Grafana dashboard

                      +

                      Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                      +
                      +

                      Caution

                      +

                      Important: do not use the local dir flag when testing!

                      +
                      +

                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                      +
                      +

                      Caution

                      +

                      Important: Do not kill the 3.x version that is currently running.

                      +
                      +
                      +
                      +

                      Killing the new 3.y Monitoring stack in testing mode

                      +

                      Use the following command to kill the containers:

                      +
                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      You can start and stop the new 3.y version while testing.

                      +
                      +
                      +

                      Move to version 3.y (the new version)

                      +

                      Note: migrating will cause a few seconds of blackout in the system.

                      +

                      We assume that you are using external volume to store the metrics data.

                      +
                      +

                      Kill all containers

                      +

                      At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                      +

                      Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                      +

                      kill the older 3.x version containers by running:

                      +
                      ./kill-all.sh
                      +
                      +
                      +

                      Start version 3.y in normal mode

                      +

                      From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                      +
                      ./start-all.sh -d /path/to/data/dir
                      +
                      +
                      +

                      Point your browser to http://{ip}:3000 and see that the data is there.

                      +
                      +
                      +
                      +

                      Rollback to version 3.x

                      +

                      To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                      +

                      To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                      +
                      ./kill-all.sh
                      +cd /path/to/scylla-grafana-3.x/
                      +./start-all.sh -d /path/to/data/dir
                      +
                      +
                      +
                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..13867cd98 --- /dev/null +++ b/branch-4.1/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,939 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                      +

                      This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                      +
                      +

                      Upgrade Procedure

                      +

                      We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                      +

                      Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                      +
                      +

                      Install 4.y (The new version)

                      +
                      wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                      +unzip scylla-monitoring-4.y.zip
                      +cd scylla-monitoring-scylla-monitoring-4.y/
                      +
                      +
                      +

                      Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                      +
                      +
                      +

                      Setting the server’s files

                      +

                      Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                      +
                      cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                      +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                      +
                      +
                      +
                      +
                      +

                      Validate the new version is running the correct version

                      +

                      run:

                      +
                      ./start-all.sh --version
                      +
                      +
                      +

                      To validate the Scylla-Monitoring version.

                      +
                      +
                      +
                      +

                      Running in test mode

                      +

                      This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                      +
                      +

                      Running second monitoring stack

                      +

                      We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                      +
                      ./start-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      Browse to http://{ip}:9091 and check the Grafana dashboard.

                      +

                      Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                      +
                      +

                      Caution

                      +

                      Important: do not use the local dir flag when testing!

                      +
                      +

                      When you are satisfied with the data in the dashboard, you can shut down the containers.

                      +
                      +

                      Caution

                      +

                      Important: Do not kill the 3.x version that is currently running!

                      +
                      +
                      +
                      +

                      Killing the new 4.y Monitoring stack in testing mode

                      +

                      Use the following command to kill the containers:

                      +
                      ./kill-all.sh -p 9091 -g 3001 -m 9095
                      +
                      +
                      +

                      You can start and stop the new 4.y version while testing.

                      +
                      +
                      +
                      +

                      Migrating

                      +
                      +

                      Move to version 4.y (the new version)

                      +

                      Note: migrating will cause a few seconds of blackout in the system.

                      +

                      We assume that you are using external volume to store the metrics data.

                      +
                      +

                      Backup

                      +

                      We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                      +
                      +
                      +

                      Kill all containers

                      +

                      At this point you have two monitoring stacks installed with the older version running.

                      +

                      If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                      +

                      kill the older 3.x version containers by running:

                      +
                      ./kill-all.sh
                      +
                      +
                      +

                      Start version 4.y in normal mode

                      +

                      From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                      +
                      ./start-all.sh -d /path/to/copy/data/dir
                      +
                      +
                      +

                      Point your browser to http://{ip}:3000 and see that the data is there.

                      +
                      +
                      +
                      +

                      Rollback to version 3.x

                      +

                      To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                      +

                      To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                      +
                      ./kill-all.sh
                      +cd /path/to/scylla-grafana-3.x/
                      +./start-all.sh -d /path/to/original/data/dir
                      +
                      +
                      +
                      +
                      +
                      +

                      Post-installation: Metrics back-filling

                      +

                      Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                      +

                      For example, this is a recording rule that calculates the p99 write latency:

                      +
                      - record: wlatencyp99
                      +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                      +  labels:
                      +    by: "instance,shard"
                      +
                      +
                      +

                      For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                      +

                      Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                      +
                      +
                      +

                      Note

                      +

                      If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                      +
                      +
                      +
                      +../_images/before-backfilling.png +
                      +

                      This is an example of missing latency graph

                      +
                      +
                      +

                      The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                      +

                      For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                      +

                      In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                      +

                      The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                      +
                      +

                      Determine the backfilling period

                      +

                      When you run the backfilling process you need to determine the start time and end time.

                      +
                      +

                      Determine the start time

                      +

                      The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                      +

                      If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                      +

                      For the rest of this example, we will assume that your retention time is 360 days.

                      +
                      +
                      +

                      Determine the end time

                      +

                      Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                      +

                      If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                      +

                      That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                      +

                      The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                      +
                      +
                      +
                      +

                      Backfilling Process

                      +
                      +

                      backup

                      +

                      If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                      +

                      To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                      +
                      +
                      +

                      Restart the monitoring stack

                      +

                      You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                      +

                      -b "--storage.tsdb.allow-overlapping-blocks"

                      +
                      +
                      +

                      Create the data files

                      +

                      We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                      +

                      The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                      +

                      Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                      +
                      docker exec -it aprom sh
                      +cd /prometheus/data/
                      +promtool tsdb create-blocks-from rules \
                      +--start $start \
                      +--end $end \
                      +--url http://localhost:9090 \
                      +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                      +
                      +
                      +

                      It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                      +
                      +
                      +

                      Note

                      +

                      Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                      +
                      +
                      +
                      +
                      +

                      Copy the data files

                      +

                      Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                      +

                      Copy the data files to the Prometheus directory:

                      +
                      cp data/* .
                      +
                      +
                      +

                      The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                      +

                      Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                      +
                      +../_images/after-backfilling.jpg +
                      +

                      Un example: after loading half of the data

                      +
                      +
                      +
                      +
                      +
                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.1/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..968893135 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries use ALLOW FILTERING

                      +

                      Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                      +

                      These kinds of queries can create a bigger load on Scylla, and should be used with care.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlCLAll.html b/branch-4.1/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..a0e048a3d --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries use Consistency Level: ALL

                      +

                      Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                      +

                      Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                      +

                      Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlCLAny.html b/branch-4.1/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..a5083b3be --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries use Consistency Level: ANY

                      +

                      Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                      +

                      Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.1/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..7b9e9760b --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries are not token-aware

                      +

                      Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                      +

                      Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlNonPaged.html b/branch-4.1/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..9b42dbc47 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some SELECT queries are non-paged

                      +

                      By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                      +
                      +

                      Blog-post Links

                      +

                      https://www.scylladb.com/2018/07/13/efficient-query-paging/

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.1/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..dd2539dd6 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries are non-prepared

                      +

                      Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.1/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..d60711049 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Some queries use reverse order

                      +

                      Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                      +

                      Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/heavyCompaction.html b/branch-4.1/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..9daca8de4 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Compaction takes lots of memory and CPU

                      +

                      ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                      +

                      If this is the case, you can do one of the following:

                      +
                        +
                      • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                        +
                        +
                          +
                        • In the scylla.yml configuration file: compaction_static_shares: 100

                        • +
                        • In the command line when starting ScyllaDB: --compaction-static-shares 100

                        • +
                        +
                        +

                        You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                        +
                      • +
                      • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                      • +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/index.html b/branch-4.1/use-monitoring/advisor/index.html new file mode 100644 index 000000000..5016da8fe --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/index.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Scylla Monitoring Stack Advisor

                      +
                      +
                      +

                      The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                      +
                      +

                      The Advisor section

                      +
                      +../../_images/advisor_panel.png +
                      +

                      The Advisor section

                      +
                      +
                      +

                      The Advisor section is located on the Overview dashboard and consists of two parts:

                      +

                      On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                      +

                      For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                      +

                      On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                      +

                      For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                      +

                      Each Advisor issue is explained in detail:

                      + +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/nodeCLErrors.html b/branch-4.1/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..96ca78149 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Some operation failed due to unsatisfied consistency level

                      +

                      ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                      +

                      For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                      +

                      When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/nodeIOErrors.html b/branch-4.1/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..3a1129376 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      I/O Errors can indicate a node with a faulty disk

                      +

                      I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.1/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..870643ef9 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Some operations failed on the replica side

                      +

                      ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                      +

                      An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.1/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..59f54eb1c --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      CQL queries are not balanced among shards

                      +

                      For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                      +

                      There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                      +
                      +

                      Blog post link

                      +

                      https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.1/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..90b096c91 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      Prepared statements cache eviction

                      +

                      Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                      +
                        +
                      • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                      • +
                      • The prepared statements cache might be too small for the number of prepared statements.

                      • +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/advisor/systemOverload.html b/branch-4.1/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..8f5259ee6 --- /dev/null +++ b/branch-4.1/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      System Overload

                      +

                      There could be multiple indications that a system is overloaded:

                      +
                        +
                      • Timeouts

                      • +
                      • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                      • +
                      • CPU at 100% when no background process (like compaction or repair) runs.

                      • +
                      • Ques are getting filled.

                      • +
                      +

                      If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/cql_optimization.html b/branch-4.1/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..8d4be5b21 --- /dev/null +++ b/branch-4.1/use-monitoring/cql_optimization.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + + + +
                      +

                      The CQL Optimization

                      +

                      The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                      +
                      +../_images/cql_optimization_master.png +
                      +

                      The CQL Dashboard

                      +
                      +
                      +

                      The upper part of the dashboard holds CQL related metrics.

                      +

                      The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                      +
                      +

                      Note

                      +

                      Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                      +
                      +

                      The following sections describe each of the dashboard’s panel

                      +
                      +

                      Prepared Statements

                      +

                      Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                      +

                      Using prepared statements has the following benefits:

                      +
                        +
                      • The database only needs to parse the query once

                      • +
                      • The driver can route the query to the right node

                      • +
                      • Using place-holders and values is safer and prevents CQL-Injection

                      • +
                      +

                      The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                      +

                      The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                      +
                      +
                      +

                      Token Aware

                      +

                      Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                      +

                      Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                      +

                      The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                      +

                      The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                      +
                      +
                      +

                      Paged Queries

                      +

                      By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                      +

                      The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                      +

                      The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                      +
                      +
                      +

                      Reversed CQL Reads

                      +

                      Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                      +

                      Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                      +

                      For example, look at the following table:

                      +
                      CREATE TABLE ks1.table_demo (
                      +   category text,
                      +   type int,
                      +   PRIMARY KEY (category, type))
                      +WITH CLUSTERING ORDER BY (type DESC);
                      +
                      +
                      +

                      The following query uses reverse order:

                      +
                      select * from ks1.table_demo where category='cat1' order by type ASC;
                      +
                      +
                      +

                      The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                      +

                      The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                      +
                      +
                      +

                      ALLOW FILTERING

                      +

                      Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                      +

                      These kinds of queries can create a big load on the system, and should be used with care.

                      +

                      The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                      +

                      The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                      +

                      The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                      +

                      The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                      +

                      The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                      +
                      +
                      +

                      Consistency Level

                      +

                      Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                      +

                      The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                      +

                      Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                      +

                      The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                      +

                      The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                      +

                      The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                      +

                      The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                      +
                      +
                      +

                      Cross DC

                      +

                      Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                      +
                      +
                      +

                      Cross DC Consistency Level

                      +

                      Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                      +
                      +
                      +

                      Cross DC read requests

                      +
                      +

                      Note

                      +

                      The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                      +
                      +

                      In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                      +

                      The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                      +
                      +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.1/use-monitoring/index.html b/branch-4.1/use-monitoring/index.html new file mode 100644 index 000000000..1acaa16a8 --- /dev/null +++ b/branch-4.1/use-monitoring/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +
                      +

                      Using Scylla Monitoring Stack

                      +
                      +
                      +

                      There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                      + +
                      + + +
                      + + + + + + + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.2/.buildinfo b/branch-4.2/.buildinfo new file mode 100644 index 000000000..fe3f4ce49 --- /dev/null +++ b/branch-4.2/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 53667a307d285176008715b45bc2eac9 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.2/.doctrees/_common/monitor-description.doctree b/branch-4.2/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..30b87b708 Binary files /dev/null and b/branch-4.2/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-4.2/.doctrees/environment.pickle b/branch-4.2/.doctrees/environment.pickle new file mode 100644 index 000000000..aac73a957 Binary files /dev/null and b/branch-4.2/.doctrees/environment.pickle differ diff --git a/branch-4.2/.doctrees/index.doctree b/branch-4.2/.doctrees/index.doctree new file mode 100644 index 000000000..129afaae6 Binary files /dev/null and b/branch-4.2/.doctrees/index.doctree differ diff --git a/branch-4.2/.doctrees/install/docker_compose.doctree b/branch-4.2/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..f0fbbfa6e Binary files /dev/null and b/branch-4.2/.doctrees/install/docker_compose.doctree differ diff --git a/branch-4.2/.doctrees/install/index.doctree b/branch-4.2/.doctrees/install/index.doctree new file mode 100644 index 000000000..49b3a3117 Binary files /dev/null and b/branch-4.2/.doctrees/install/index.doctree differ diff --git a/branch-4.2/.doctrees/install/min-prod-hw.doctree b/branch-4.2/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..8ca14f9c7 Binary files /dev/null and b/branch-4.2/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.2/.doctrees/install/monitor_without_docker.doctree b/branch-4.2/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..5b93985d9 Binary files /dev/null and b/branch-4.2/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-4.2/.doctrees/install/monitoring_stack.doctree b/branch-4.2/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..00c89467c Binary files /dev/null and b/branch-4.2/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-4.2/.doctrees/install/start_all.doctree b/branch-4.2/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..984756061 Binary files /dev/null and b/branch-4.2/.doctrees/install/start_all.doctree differ diff --git a/branch-4.2/.doctrees/install/thanos.doctree b/branch-4.2/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..a6bd520a2 Binary files /dev/null and b/branch-4.2/.doctrees/install/thanos.doctree differ diff --git a/branch-4.2/.doctrees/intro.doctree b/branch-4.2/.doctrees/intro.doctree new file mode 100644 index 000000000..24a4919e4 Binary files /dev/null and b/branch-4.2/.doctrees/intro.doctree differ diff --git a/branch-4.2/.doctrees/procedures/alerts/alerting.doctree b/branch-4.2/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..60007d54d Binary files /dev/null and b/branch-4.2/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.2/.doctrees/procedures/alerts/index.doctree b/branch-4.2/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..f3f961b0b Binary files /dev/null and b/branch-4.2/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.2/.doctrees/procedures/datadog/index.doctree b/branch-4.2/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..2fb2445b3 Binary files /dev/null and b/branch-4.2/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.2/.doctrees/procedures/index.doctree b/branch-4.2/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..0b56fd83d Binary files /dev/null and b/branch-4.2/.doctrees/procedures/index.doctree differ diff --git a/branch-4.2/.doctrees/procedures/updating_dashboard.doctree b/branch-4.2/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..178a090e2 Binary files /dev/null and b/branch-4.2/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-4.2/.doctrees/reference/index.doctree b/branch-4.2/.doctrees/reference/index.doctree new file mode 100644 index 000000000..b9561320b Binary files /dev/null and b/branch-4.2/.doctrees/reference/index.doctree differ diff --git a/branch-4.2/.doctrees/reference/matrix.doctree b/branch-4.2/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..e1e767710 Binary files /dev/null and b/branch-4.2/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.2/.doctrees/reference/monitoring_apis.doctree b/branch-4.2/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..6c58e52a7 Binary files /dev/null and b/branch-4.2/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-4.2/.doctrees/troubleshooting/index.doctree b/branch-4.2/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..b234340af Binary files /dev/null and b/branch-4.2/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.2/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-4.2/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..9fac302a1 Binary files /dev/null and b/branch-4.2/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/index.doctree b/branch-4.2/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..72602bd56 Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..f1eda1d5e Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..2222a6445 Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..6840aff6f Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..8da848e13 Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..df3e74812 Binary files /dev/null and b/branch-4.2/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..2b28dfa72 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..a28cf0620 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..61240720a Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..bc2648aa9 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..a2ee6ff05 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..cfd461d31 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..3636cf8cd Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..7a3788da0 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..b6007038c Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..634384ea9 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..fc6281618 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..75aaf545e Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..b76a0ae4b Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..c7c5e567c Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.2/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..c3414ae86 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/cql_optimization.doctree b/branch-4.2/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..29739a04a Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-4.2/.doctrees/use-monitoring/index.doctree b/branch-4.2/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..2f90f2fe6 Binary files /dev/null and b/branch-4.2/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.2/.nojekyll b/branch-4.2/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.2/404.html b/branch-4.2/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.2/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                      +

                      404

                      +

                      The ScyllaDB monster ate your page!

                      +

                      + Home +

                      +
                      + + + \ No newline at end of file diff --git a/branch-4.2/CNAME b/branch-4.2/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.2/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.2/_common/monitor-description.html b/branch-4.2/_common/monitor-description.html new file mode 100644 index 000000000..5363d0dee --- /dev/null +++ b/branch-4.2/_common/monitor-description.html @@ -0,0 +1,646 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                      + + + +
                      +
                      + Menu +
                      +
                      +
                      +
                      +
                      + + +
                      +

                      Caution

                      +

                      + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                      +
                      + + + +
                      + +
                      + +

                      ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                      + + +
                      + + + + + +
                      + + +
                      + +
                      + +
                      + + + + +
                      + + + + + + + \ No newline at end of file diff --git a/branch-4.2/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.2/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..2839773fe --- /dev/null +++ b/branch-4.2/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,259 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + \ No newline at end of file diff --git a/branch-4.2/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.2/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.2/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.2/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.2/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..01b3668be --- /dev/null +++ b/branch-4.2/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,125 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={level=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.2/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.2/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..cfaca626e --- /dev/null +++ b/branch-4.2/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.2/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.2/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..51d635292 --- /dev/null +++ b/branch-4.2/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={level=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.2/_images/1.png b/branch-4.2/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.2/_images/1.png differ diff --git a/branch-4.2/_images/2.png b/branch-4.2/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.2/_images/2.png differ diff --git a/branch-4.2/_images/3.png b/branch-4.2/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.2/_images/3.png differ diff --git a/branch-4.2/_images/advisor_panel.png b/branch-4.2/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.2/_images/advisor_panel.png differ diff --git a/branch-4.2/_images/after-backfilling.jpg b/branch-4.2/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.2/_images/after-backfilling.jpg differ diff --git a/branch-4.2/_images/alertmanager.png b/branch-4.2/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.2/_images/alertmanager.png differ diff --git a/branch-4.2/_images/before-backfilling.png b/branch-4.2/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.2/_images/before-backfilling.png differ diff --git a/branch-4.2/_images/cql_optimization_master.png b/branch-4.2/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.2/_images/cql_optimization_master.png differ diff --git a/branch-4.2/_images/datadog.png b/branch-4.2/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.2/_images/datadog.png differ diff --git a/branch-4.2/_images/grafana.png b/branch-4.2/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.2/_images/grafana.png differ diff --git a/branch-4.2/_images/monitor.png b/branch-4.2/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.2/_images/monitor.png differ diff --git a/branch-4.2/_images/monitoring_stack.png b/branch-4.2/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.2/_images/monitoring_stack.png differ diff --git a/branch-4.2/_images/monitoring_stack1.png b/branch-4.2/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.2/_images/monitoring_stack1.png differ diff --git a/branch-4.2/_sources/_common/monitor-description.rst.txt b/branch-4.2/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.2/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.2/_sources/index.rst.txt b/branch-4.2/_sources/index.rst.txt new file mode 100644 index 000000000..97ea5ff5a --- /dev/null +++ b/branch-4.2/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on Scylla University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.2/_sources/install/docker_compose.rst.txt b/branch-4.2/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.2/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.2/_sources/install/index.rst.txt b/branch-4.2/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-4.2/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.2/_sources/install/min-prod-hw.rst.txt b/branch-4.2/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.2/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                      + + + + + + + + + + + +
                      # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                      00
                      + +
                      + \ No newline at end of file diff --git a/branch-4.2/_sources/install/monitor_without_docker.rst.txt b/branch-4.2/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..08b771b73 --- /dev/null +++ b/branch-4.2/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                      `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.2/_sources/install/monitoring_stack.rst.txt b/branch-4.2/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..8f1705547 --- /dev/null +++ b/branch-4.2/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,395 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API <../../reference/monitoring_apis/#prometheus>`_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                      `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to Scylla +...................................... + +Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +To set a user/password edit `grafana/provisioning/datasources/datasource.yaml`. + +Under **scylla-datasource** Uncomment the **secureJsonData** part and set the user and password. + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.2/_sources/install/start_all.rst.txt b/branch-4.2/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..c2e927a99 --- /dev/null +++ b/branch-4.2/_sources/install/start_all.rst.txt @@ -0,0 +1,100 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.2/_sources/install/thanos.rst.txt b/branch-4.2/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.2/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.2/_sources/intro.rst.txt b/branch-4.2/_sources/intro.rst.txt new file mode 100644 index 000000000..67e73435b --- /dev/null +++ b/branch-4.2/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.2/_sources/procedures/alerts/alerting.rst.txt b/branch-4.2/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.2/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.2/_sources/procedures/alerts/index.rst.txt b/branch-4.2/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.2/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.2/_sources/procedures/datadog/index.rst.txt b/branch-4.2/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..23bfc480c --- /dev/null +++ b/branch-4.2/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,63 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the promemtheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +Add datadog recording rules +=========================== +Non cloud users, download the rules configuration file :download:`datadog.rules.yml ` and place it under prometheus/prom_rules/. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.2/_sources/procedures/index.rst.txt b/branch-4.2/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..9e17f2aa1 --- /dev/null +++ b/branch-4.2/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.2/_sources/procedures/updating_dashboard.rst.txt b/branch-4.2/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.2/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.2/_sources/reference/index.rst.txt b/branch-4.2/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-4.2/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.2/_sources/reference/matrix.rst.txt b/branch-4.2/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..5e3a70d72 --- /dev/null +++ b/branch-4.2/_sources/reference/matrix.rst.txt @@ -0,0 +1,140 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.2/_sources/reference/monitoring_apis.rst.txt b/branch-4.2/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-4.2/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.2/_sources/troubleshooting/index.rst.txt b/branch-4.2/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-4.2/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.2/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-4.2/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..3de2b7d6f --- /dev/null +++ b/branch-4.2/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,230 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.2/_sources/upgrade/index.rst.txt b/branch-4.2/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..817f65247 --- /dev/null +++ b/branch-4.2/_sources/upgrade/index.rst.txt @@ -0,0 +1,42 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                      +
                      +
                      +
                      Upgrade Scylla Open Source
                      +
                      +
                      + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                      +
                      +
                      diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..b64fd5d7e --- /dev/null +++ b/branch-4.2/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,281 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.2/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.2/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.2/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.2/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.2/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.2/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.2/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.2/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.2/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.2/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.2/_sources/use-monitoring/cql_optimization.rst.txt b/branch-4.2/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.2/_sources/use-monitoring/index.rst.txt b/branch-4.2/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-4.2/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.2/_static/basic.css b/branch-4.2/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.2/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.2/_static/check-solid.svg b/branch-4.2/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.2/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.2/_static/clipboard.min.js b/branch-4.2/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.2/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.2/_static/copybutton.css b/branch-4.2/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.2/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                      Short

                      + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.2/_static/copybutton.js b/branch-4.2/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.2/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.2/_static/copybutton_funcs.js b/branch-4.2/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.2/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.2/_static/css/main.css b/branch-4.2/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-4.2/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.2/_static/doctools.js b/branch-4.2/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.2/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.2/_static/documentation_options.js b/branch-4.2/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.2/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.2/_static/file.png b/branch-4.2/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.2/_static/file.png differ diff --git a/branch-4.2/_static/img/banner-background.svg b/branch-4.2/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.2/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.2/_static/img/favicon-228x228.png b/branch-4.2/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.2/_static/img/favicon-228x228.png differ diff --git a/branch-4.2/_static/img/favicon-32x32.png b/branch-4.2/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.2/_static/img/favicon-32x32.png differ diff --git a/branch-4.2/_static/img/favicon.ico b/branch-4.2/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.2/_static/img/favicon.ico differ diff --git a/branch-4.2/_static/img/icons/icon-about-team.svg b/branch-4.2/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.2/_static/img/icons/icon-about-us-m.svg b/branch-4.2/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-about-us.svg b/branch-4.2/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-alternator.svg b/branch-4.2/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-apps.svg b/branch-4.2/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-architecture.svg b/branch-4.2/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.2/_static/img/icons/icon-benchmarks.svg b/branch-4.2/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.2/_static/img/icons/icon-blog.svg b/branch-4.2/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.2/_static/img/icons/icon-careers.svg b/branch-4.2/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.2/_static/img/icons/icon-chevron-left.svg b/branch-4.2/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.2/_static/img/icons/icon-chevron-right.svg b/branch-4.2/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.2/_static/img/icons/icon-circe.svg b/branch-4.2/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-clock.svg b/branch-4.2/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-close.svg b/branch-4.2/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-cloud-docs.svg b/branch-4.2/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-cloud.svg b/branch-4.2/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-comparison.svg b/branch-4.2/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.2/_static/img/icons/icon-contact-us.svg b/branch-4.2/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.2/_static/img/icons/icon-developers-blog.svg b/branch-4.2/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.2/_static/img/icons/icon-docs.svg b/branch-4.2/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.2/_static/img/icons/icon-enterprise-m.svg b/branch-4.2/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-enterprise.svg b/branch-4.2/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-events.svg b/branch-4.2/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.2/_static/img/icons/icon-exclamation.svg b/branch-4.2/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-expand.svg b/branch-4.2/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-forum.svg b/branch-4.2/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-getting-started.svg b/branch-4.2/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-glossary.svg b/branch-4.2/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-home.svg b/branch-4.2/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-infoworld.svg b/branch-4.2/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.2/_static/img/icons/icon-integrations.svg b/branch-4.2/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-knowledge-base.svg b/branch-4.2/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-less.svg b/branch-4.2/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-live-test.svg b/branch-4.2/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.2/_static/img/icons/icon-mail-list.svg b/branch-4.2/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-manager.svg b/branch-4.2/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.2/_static/img/icons/icon-memory-management.svg b/branch-4.2/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.2/_static/img/icons/icon-modeling.svg b/branch-4.2/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-monitoring.svg b/branch-4.2/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.2/_static/img/icons/icon-networking.svg b/branch-4.2/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.2/_static/img/icons/icon-news.svg b/branch-4.2/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.2/_static/img/icons/icon-newsletter.svg b/branch-4.2/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.2/_static/img/icons/icon-nsql-guides.svg b/branch-4.2/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.2/_static/img/icons/icon-open-source.svg b/branch-4.2/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.2/_static/img/icons/icon-operator.svg b/branch-4.2/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-overview.svg b/branch-4.2/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.2/_static/img/icons/icon-partners.svg b/branch-4.2/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.2/_static/img/icons/icon-plus.svg b/branch-4.2/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-pricing.svg b/branch-4.2/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.2/_static/img/icons/icon-release-notes.svg b/branch-4.2/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.2/_static/img/icons/icon-resource-center.svg b/branch-4.2/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.2/_static/img/icons/icon-roadmap.svg b/branch-4.2/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.2/_static/img/icons/icon-search.svg b/branch-4.2/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.2/_static/img/icons/icon-slack.svg b/branch-4.2/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-stack-overflow.svg b/branch-4.2/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.2/_static/img/icons/icon-summit.svg b/branch-4.2/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/icons/icon-support.svg b/branch-4.2/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.2/_static/img/icons/icon-tech-talks.svg b/branch-4.2/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.2/_static/img/icons/icon-testing.svg b/branch-4.2/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.2/_static/img/icons/icon-thumbs-down.svg b/branch-4.2/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-thumbs-up.svg b/branch-4.2/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.2/_static/img/icons/icon-tip.svg b/branch-4.2/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.2/_static/img/icons/icon-training.svg b/branch-4.2/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.2/_static/img/icons/icon-triangle-down.svg b/branch-4.2/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.2/_static/img/icons/icon-university.svg b/branch-4.2/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.2/_static/img/icons/icon-users-blog.svg b/branch-4.2/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.2/_static/img/icons/icon-warning.svg b/branch-4.2/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.2/_static/img/icons/icon-webinars.svg b/branch-4.2/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.2/_static/img/icons/icon-whitepapers.svg b/branch-4.2/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.2/_static/img/icons/icon-workshop.svg b/branch-4.2/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.2/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.2/_static/img/logo-docs.svg b/branch-4.2/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.2/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.2/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.2/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.2/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.2/_static/img/mascots/404.jpg b/branch-4.2/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.2/_static/img/mascots/404.jpg differ diff --git a/branch-4.2/_static/img/mascots/scylla-3monsters.png b/branch-4.2/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.2/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-alternator.svg b/branch-4.2/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.2/_static/img/mascots/scylla-cloud.svg b/branch-4.2/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.2/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.2/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-computer-headset.png b/branch-4.2/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-cup-number-one.png b/branch-4.2/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-docs.svg b/branch-4.2/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.2/_static/img/mascots/scylla-drivers.svg b/branch-4.2/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.2/_static/img/mascots/scylla-enterprise.svg b/branch-4.2/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.2/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.2/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-forklift-migration.png b/branch-4.2/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-gear.png b/branch-4.2/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-hardhat.png b/branch-4.2/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-headband.png b/branch-4.2/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-headset.png b/branch-4.2/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-hearts.png b/branch-4.2/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-looking-down.png b/branch-4.2/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-looking-up.png b/branch-4.2/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.2/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.2/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-manager.svg b/branch-4.2/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.2/_static/img/mascots/scylla-monitor.svg b/branch-4.2/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.2/_static/img/mascots/scylla-movement-fast.png b/branch-4.2/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-movement.png b/branch-4.2/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-onpremise.png b/branch-4.2/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-opensource.svg b/branch-4.2/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.2/_static/img/mascots/scylla-operator.svg b/branch-4.2/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.2/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.2/_static/img/mascots/scylla-plugin.png b/branch-4.2/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-release-mascot.png b/branch-4.2/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-repair.png b/branch-4.2/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-server.png b/branch-4.2/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-sleeping.png b/branch-4.2/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-tall-measure.png b/branch-4.2/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-university.png b/branch-4.2/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-weights.png b/branch-4.2/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-window-cleaning.png b/branch-4.2/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-with-computer-2.png b/branch-4.2/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-with-computer.png b/branch-4.2/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-with-linux.png b/branch-4.2/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.2/_static/img/mascots/scylla-writting.png b/branch-4.2/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.2/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.2/_static/img/menu.svg b/branch-4.2/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.2/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.2/_static/img/scylla-monitor.png b/branch-4.2/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.2/_static/img/scylla-monitor.png differ diff --git a/branch-4.2/_static/js/main.bundle.js b/branch-4.2/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-4.2/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                    • Back
                    • ',backButtonPosition:"top",wrapper:"
                      ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                        "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                        ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                        ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                        ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                        ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                        "],col:[2,"","
                        "],tr:[2,"","
                        "],td:[3,"","
                        "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + + + +
                        + + + + + +
                        + + +
                        + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/index.html b/branch-4.2/index.html new file mode 100644 index 000000000..fd1c49397 --- /dev/null +++ b/branch-4.2/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        ScyllaDB Monitoring Stack

                        +
                        +
                        +

                        ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                        +_images/monitor.png +

                        The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                        +
                          +
                        • prometheus - collects and stores metrics

                        • +
                        • alertmanager - handles alerts

                        • +
                        • grafana - dashboard server

                        • +
                        +

                        Choose a topic to get started:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/docker_compose.html b/branch-4.2/install/docker_compose.html new file mode 100644 index 000000000..20f777a1b --- /dev/null +++ b/branch-4.2/install/docker_compose.html @@ -0,0 +1,810 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Using Docker Compose

                        +

                        Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                        +

                        Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                        +
                        +

                        Warning

                        +

                        docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                        +
                        +
                        +

                        Prerequisite

                        +

                        Make sure you have docker and docker-compose installed.

                        +
                        +
                        +

                        Setting Prometheus

                        +

                        The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                        +

                        You can use ./prometheus-config.sh to generate the file, for example:

                        +
                        ./prometheus-config.sh --compose
                        +
                        +
                        +

                        For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                        +
                        +
                        +

                        Setting Grafana Provisioning

                        +

                        Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                        +
                        +

                        Grafana Data-Source file

                        +

                        Run the following command to update the datasource:

                        +
                        ./grafana-datasource.sh --compose
                        +
                        +
                        +

                        You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                        +
                        +
                        +

                        Grafana Dashboard Load file

                        +

                        To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                        +
                        ./generate-dashboards.sh -t -v 2020.1
                        +
                        +
                        +

                        This command generates the files under: grafana/provisioning/dashboards/

                        +
                        +
                        +
                        +

                        Docker Compose file

                        +

                        You can use the following example as a base for your docker compose.

                        +

                        Pass the following to a file called docker-compose.yml

                        +
                        services:
                        +  alertmanager:
                        +    container_name: aalert
                        +    image: prom/alertmanager:v0.21.0
                        +    ports:
                        +    - 9093:9093
                        +    volumes:
                        +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                        +  grafana:
                        +    container_name: agraf
                        +    environment:
                        +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                        +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                        +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                        +    # This is where you set Grafana security
                        +    - GF_AUTH_BASIC_ENABLED=false
                        +    - GF_AUTH_ANONYMOUS_ENABLED=true
                        +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                        +    - GF_SECURITY_ADMIN_PASSWORD=admin
                        +    image: grafana/grafana:7.3.5
                        +    ports:
                        +    - 3000:3000
                        +    user: 1000:1000
                        +    volumes:
                        +    - ./grafana/build:/var/lib/grafana/dashboards
                        +    - ./grafana/plugins:/var/lib/grafana/plugins
                        +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                        +    # Uncomment the following line for grafana persistency
                        +    # - path/to/grafana/dir:/var/lib/grafana
                        +  loki:
                        +    command:
                        +    - --config.file=/mnt/config/loki-config.yaml
                        +    container_name: loki
                        +    image: grafana/loki:2.0.0
                        +    ports:
                        +    - 3100:3100
                        +    volumes:
                        +    - ./loki/rules:/etc/loki/rules
                        +    - ./loki/conf:/mnt/config
                        +  promotheus:
                        +    command:
                        +    - --config.file=/etc/prometheus/prometheus.compose.yml
                        +    container_name: aprom
                        +    image: prom/prometheus:v2.18.1
                        +    ports:
                        +    - 9090:9090
                        +    volumes:
                        +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                        +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                        +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                        +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                        +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                        +    # Uncomment the following line for prometheus persistency 
                        +    # - path/to/data/dir:/prometheus/data
                        +  promtail:
                        +    command:
                        +    - --config.file=/etc/promtail/config.yml
                        +    container_name: promtail
                        +    image: grafana/promtail:2.0.0
                        +    ports:
                        +    - 1514:1514
                        +    - 9080:9080
                        +    volumes:
                        +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                        +version: '3'
                        +
                        +
                        +
                        +

                        Start and Stop

                        +

                        To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/index.html b/branch-4.2/install/index.html new file mode 100644 index 000000000..ceb4c3474 --- /dev/null +++ b/branch-4.2/install/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Download and Install Scylla Monitoring Stack

                        +
                        +
                        +

                        Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                        +

                        Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/min-prod-hw.html b/branch-4.2/install/min-prod-hw.html new file mode 100644 index 000000000..402e35323 --- /dev/null +++ b/branch-4.2/install/min-prod-hw.html @@ -0,0 +1,739 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Minimal Production System Recommendations

                        +
                          +
                        • CPU - at least 2 physical cores/ 4vCPUs

                        • +
                        • Memory - 15GB+ DRAM and proportional to the number of cores.

                        • +
                        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                        • +
                        • Network - 1GbE/10GbE preferred

                        • +
                        +
                        +

                        Calculating Prometheus Minimal Disk Space requirement

                        +

                        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                        +

                        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                        +

                        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                        +
                        6 * 16 * 15 * 12MB ~ 16GB
                        +
                        +
                        +

                        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                        +
                        +
                        +

                        Calculating Prometheus Minimal Memory Space requirement

                        +

                        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                        +

                        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                        + +
                        + +++++++ + + + +
                        # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                        00
                        + +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/monitor_without_docker.html b/branch-4.2/install/monitor_without_docker.html new file mode 100644 index 000000000..34036a4fd --- /dev/null +++ b/branch-4.2/install/monitor_without_docker.html @@ -0,0 +1,1155 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Deploying Scylla Monitoring Stack Without Docker

                        +
                        +

                        Introduction

                        +

                        The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                        +

                        Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                        +

                        Scylla Monitoring uses the following components:

                        +
                          +
                        • Alertmanager

                        • +
                        • Grafana Loki

                        • +
                        • Prometheus

                        • +
                        • Grafana

                        • +
                        +

                        The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                        +

                        We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                        +
                        +
                        +

                        Minimal Production System Recommendations

                        +
                          +
                        • CPU - at least 2 physical cores/ 4vCPUs

                        • +
                        • Memory - 15GB+ DRAM and proportional to the number of cores.

                        • +
                        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                        • +
                        • Network - 1GbE/10GbE preferred

                        • +
                        +
                        +

                        Calculating Prometheus Minimal Disk Space requirement

                        +

                        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                        +

                        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                        +

                        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                        +
                        6 * 16 * 15 * 12MB ~ 16GB
                        +
                        +
                        +

                        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                        +
                        +
                        +

                        Calculating Prometheus Minimal Memory Space requirement

                        +

                        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                        +

                        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                        + +
                        + +++++++ + + + +
                        # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                        00
                        + +
                        +

                        The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                        +
                        +

                        Note

                        +

                        Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                        +
                        +
                        +
                        +
                        +

                        Install Scylla Monitoring Stack

                        +

                        The following procedure uses a CentOS 7 based instance

                        +
                          +
                        1. Download the latest Scylla Monitoring Stack release.

                        2. +
                        +
                        wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.2.1.tar.gz
                        +
                        +
                        +
                          +
                        1. Open the tar

                        2. +
                        +

                        tar -xvf scylla-monitoring-*.tar.gz

                        +
                        +
                        +

                        Install Alertmanager

                        +

                        Tested with alertmanager 0.22.2 version

                        +
                          +
                        1. Install alertmanager

                        2. +
                        +
                        wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                        +tar -xvf alertmanager-*.linux-amd64.tar.gz
                        +
                        +
                        +
                          +
                        1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                        2. +
                        +

                        For example:

                        +
                        cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.2.1/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                        +
                        +
                        +
                          +
                        1. Start the Alertmanager

                        2. +
                        +

                        For example:

                        +
                        cd alertmanager-0.22.2.linux-amd64
                        +./alertmanager
                        +
                        +
                        +
                          +
                        1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                        2. +
                        +

                        For example:

                        +
                        http://192.168.135.166:9093/
                        +
                        +
                        +../_images/alertmanager.png +
                        +
                        +

                        Install Grafana Loki

                        +

                        Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                        +

                        We recomand using Loki with containers, but you can install it locally as described in Loki installation

                        +

                        You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                        +

                        Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                        +

                        Loki Related files

                        +

                        Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                        +
                        mkdir -p /etc/loki/rules
                        +mkdir -p /etc/loki/config
                        +cp loki/rules/* /etc/loki/rules
                        +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                        +
                        +
                        +

                        Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                        +

                        Promtail Related files

                        +

                        Promtail has a configuration file. You need to copy and modify the configuration.

                        +
                        mkdir -p /etc/promtail/
                        +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                        +
                        +
                        +

                        Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                        +
                        +
                        +

                        Install Prometheus

                        +

                        Tested with Prometheus version 2.27.1

                        +
                        +

                        Note

                        +

                        If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                        +
                        +
                          +
                        1. Install Prometheus

                        2. +
                        +
                        wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                        +tar -xvf prometheus-*.linux-amd64.tar.gz
                        +
                        +
                        +

                        2. Create Data and Config directories +.. code-block:: shell

                        +
                        +

                        mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                        +
                        +
                          +
                        1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                        2. +
                        +

                        Copy prometheus/prometheus.yml.template to prometheus.yml

                        +

                        For example:

                        +
                        cp scylla-monitoring-scylla-monitoring-4.2.1/prometheus/prom_rules/*.yml/etc/prometheus/prom_rules/
                        +cp scylla-monitoring-scylla-monitoring-4.2.1/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                        +
                        +
                        +
                          +
                        1. Edit the prometheus.yml file to point to the correct static data sources.

                        2. +
                        +
                        +

                        Note

                        +

                        Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                        +
                        +
                        vi /etc/prometheus/prometheus.yml
                        +
                        +
                        +

                        Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                        +

                        For example if the alertmanager will run on the same host:

                        +
                        alerting:
                        +   alertmanagers:
                        +   - static_configs:
                        +       - targets:
                        +           - 127.0.0.1:9093
                        +
                        +
                        +

                        Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                        +

                        For example the scrape config for Scylla:

                        +
                        global:
                        +  scrape_interval: 5s # By default, scrape targets every 5 second.
                        +  scrape_timeout: 4s # Timeout before trying to scape a target again
                        +
                        +  # Attach these labels to any time series or alerts when communicating with
                        +  # external systems (federation, remote storage, Alertmanager).
                        +  external_labels:
                        +    monitor: 'scylla-monitor'
                        +
                        +scrape_configs:
                        +- job_name: scylla
                        +  honor_labels: false
                        +  file_sd_configs:
                        +    - files:
                        +      - /etc/scylla.d/prometheus/scylla_servers.yml
                        +  relabel_configs:
                        +    - source_labels: [__address__]
                        +      regex:  '([^:]+)'
                        +      target_label: __address__
                        +      replacement: '${1}:9180'
                        +
                        +    - source_labels: [__address__]
                        +      regex:  '(.*):.+'
                        +      target_label: instance
                        +      replacement: '${1}'
                        +
                        +
                        +
                          +
                        1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                        2. +
                        +
                        +

                        Note

                        +

                        There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                        +
                        +

                        An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                        +
                        +

                        Note

                        +

                        You must have both files even if you are not using Scylla Manager

                        +
                        +

                        Add the labels for the cluster and data-center

                        +

                        scylla_servers.yml:

                        +

                        For example:

                        +
                        cat scylla_servers.yml
                        +# List Scylla end points
                        +
                        +- targets:
                        +  - 192.168.66.6
                        +  - 192.168.66.244
                        +  labels:
                        +    cluster: cluster1
                        +    dc: dc1
                        +- targets:
                        +    - 172.17.0.3
                        +  labels:
                        +    cluster: cluster1
                        +    dc: dc2
                        +
                        +
                        +
                        +

                        Note

                        +

                        See the previous note about deprecating the node_exporter_servers.yml file.

                        +
                        +

                        scylla_manager_server.yml

                        +

                        For example:

                        +
                        - targets:
                        +  - 127.0.0.1:5090
                        +
                        +
                        +
                          +
                        1. Start Prometheus server:

                        2. +
                        +

                        For example:

                        +
                        cd scylla-monitoring-scylla-monitoring-4.2.1/
                        +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                        +
                        +
                        +

                        Data should start accumulate on: /prometheus/data

                        +
                          +
                        1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                        2. +
                        +

                        For example:

                        +
                        http://192.168.135.166:9090/
                        +
                        +
                        +../_images/1.png +

                        Prometheus console should be visible

                        +
                          +
                        1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                        2. +
                        +

                        For example:

                        +

                        node_memory_MemFree

                        +../_images/2.png +

                        And

                        +

                        scylla_reactor_utilization

                        +../_images/3.png +

                        At this point Scylla is emitting the metrics and Prometheus is able to store them.

                        +
                        +
                        +

                        Install Grafana

                        +

                        Tested with Grafna 7.5.7

                        +
                          +
                        1. Install Grafana based on the instructions here

                        2. +
                        +

                        Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                        +
                          +
                        1. Access Scylla-Grafana-monitoring directory

                        2. +
                        +
                        cd scylla-monitoring-scylla-monitoring-4.2.1/
                        +
                        +
                        +
                          +
                        1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                        2. +
                        +
                        sudo cp -r grafana/plugins /var/lib/grafana/
                        +
                        +
                        +

                        If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                        +

                        For example:

                        +
                        cp -r grafana/plugins ../grafana-7.5.7/public/app
                        +
                        +
                        +
                          +
                        1. Provision the Dashboards

                        2. +
                        +

                        For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                        +

                        For Grafana installed with yum install

                        +
                        sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                        +sudo mkdir -p /var/lib/grafana/dashboards
                        +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                        +
                        +
                        +

                        For Grafana installed from packages

                        +
                        cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                        +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                        +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                        +
                        +
                        +

                        Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                        +
                        +

                        Note

                        +

                        A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                        +
                        +
                          +
                        1. Set the data source by copy datasource.yml and edit it

                        2. +
                        +
                        sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                        +
                        +
                        +
                        +

                        Note

                        +

                        Scylla uses a plugin to read from some system tables see the section below about using it.

                        +
                        +

                        For Grafana installed from packages

                        +
                        cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                        +
                        +
                        +

                        You should set the Prometheus and the alertmanager IP and port.

                        +

                        For example

                        +
                        sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                        +apiVersion: 1
                        +datasources:
                        + - name: prometheus
                        +   type: prometheus
                        +   url: http://192.168.135.167:9090
                        +   access: proxy
                        +   basicAuth: false
                        +
                        + - name: alertmanager
                        +   type: camptocamp-prometheus-alertmanager-datasource
                        +   orgId: 1
                        +   typeLogoUrl: public/img/icn-datasource.svg
                        +   access: proxy
                        +   url: http://192.168.135.166:9093
                        +   password:
                        +   user:
                        +   database:
                        +   basicAuth:
                        +   isDefault:
                        +   jsonData:
                        +     severity_critical: '4'
                        +     severity_high: '3'
                        +     severity_warning: '2'
                        +     severity_info: '1'
                        +
                        +
                        +
                          +
                        1. Start the Grafana service

                        2. +
                        +

                        For Grafana installed with yum install

                        +

                        sudo service grafana-server start

                        +

                        For Grafana installed from packages:

                        +

                        cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                        +

                        Edit scylla.ini to reflect the right paths in the paths section of the file.

                        +
                        plugins = /home/centos/grafana-7.5.7/data/plugins
                        +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                        +
                        +
                        +

                        Start the server:

                        +
                        cd /home/centos/grafana-7.5.7/
                        +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                        +
                        +
                        +
                          +
                        1. Make sure Grafana is running

                        2. +
                        +

                        Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                        +../_images/grafana.png +
                        +
                        +

                        Using Scylla Plugin with Grafana

                        +

                        Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                        +

                        Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                        +
                        +

                        Setting a monitoring user

                        +

                        This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                        +
                          +
                        • If you have not done so, enable authorization first.

                        • +
                        • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                        • +
                        • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                        • +
                        +
                        +
                        +

                        Installing the Plugin

                        +

                        Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                        +
                        +
                        +

                        Configure the Plugin

                        +

                        Add an entry to the datasource.yml file

                        +
                        - name: scylla-datasource
                        +  type: scylladb-scylla-datasource
                        +  orgId: 1
                        +  isDefault:
                        +  jsonData:
                        +  host: ''
                        +#  secureJsonData:
                        +#    user: 'scylla_monitoring'
                        +#    password: 'scylla_monitoring'
                        +
                        +
                        +

                        As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                        +
                        +
                        +

                        Enable the Plugin

                        +

                        Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                        +

                        See more about it the Grafana configurtion.

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/monitoring_stack.html b/branch-4.2/install/monitoring_stack.html new file mode 100644 index 000000000..70b84d83f --- /dev/null +++ b/branch-4.2/install/monitoring_stack.html @@ -0,0 +1,1081 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Install Scylla Monitoring Stack

                        +

                        This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

                        +

                        The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                        +

                        For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                        +
                        +

                        Minimal Production System Recommendations

                        +
                          +
                        • CPU - at least 2 physical cores/ 4vCPUs

                        • +
                        • Memory - 15GB+ DRAM and proportional to the number of cores.

                        • +
                        • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                        • +
                        • Network - 1GbE/10GbE preferred

                        • +
                        +
                        +

                        Calculating Prometheus Minimal Disk Space requirement

                        +

                        Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                        +

                        Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                        +

                        For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                        +
                        6 * 16 * 15 * 12MB ~ 16GB
                        +
                        +
                        +

                        To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                        +
                        +
                        +

                        Calculating Prometheus Minimal Memory Space requirement

                        +

                        Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                        +

                        For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                        + +
                        + +++++++ + + + +
                        # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                        00
                        + +
                        +
                        +
                        +
                        +

                        Prerequisites

                        +
                          +
                        • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                        • +
                        • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                        • +
                        + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        Scylla Monitoring Stack Compatibility Matrix

                        Scylla Monitoring Stack Version

                        Prometheus Version

                        Grafana Version

                        4.2

                        2.41.0

                        9.3.4

                        4.1

                        2.38.0

                        9.1.0

                        4.0

                        2.34.0

                        8.5.2

                        3.11

                        2.32.0

                        8.3.4

                        3.10

                        2.32.0

                        8.3.3

                        3.9.2

                        2.29.1

                        8.2.7

                        3.9

                        2.29.1

                        8.1.1

                        3.8

                        2.27.1

                        7.5.7

                        3.7

                        2.25.2

                        7.4.0

                        3.6

                        2.18.1

                        7.3.5

                        3.5

                        2.18.1

                        7.1.5

                        3.4

                        2.18.1

                        6.7.3

                        +
                        +
                        +

                        Docker Post Installation

                        +

                        Docker post installation guide can be found here

                        +
                        +

                        Note

                        +

                        Avoid running the container as root.

                        +
                        +

                        To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                        +
                          +
                        1. Create the Docker group.

                        2. +
                        +
                        sudo groupadd docker
                        +
                        +
                        +
                          +
                        1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                        2. +
                        +
                        sudo usermod -aG docker $USER
                        +
                        +
                        +
                          +
                        1. Start Docker by calling:

                        2. +
                        +
                        sudo systemctl enable docker
                        +
                        +
                        +
                        +
                        +

                        Install Scylla Monitoring Stack

                        +

                        Procedure

                        +
                          +
                        1. Download and extract the latest Scylla Monitoring Stack binary;.

                        2. +
                        +
                        wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.2.1.tar.gz
                        +tar -xvf scylla-monitoring-4.2.1.tar.gz
                        +cd scylla-monitoring-scylla-monitoring-4.2.1
                        +
                        +
                        +

                        As an alternative, you can clone and use the Git repository directly.

                        +
                        git clone https://github.com/scylladb/scylla-monitoring.git
                        +cd scylla-monitoring
                        +git checkout branch-4.2
                        +
                        +
                        +
                          +
                        1. Start Docker service if needed

                        2. +
                        +
                        sudo systemctl restart docker
                        +
                        +
                        +
                        +
                        +

                        Configure Scylla Monitoring Stack

                        +

                        To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                        +

                        This configuration can be done from files, or using the Consul api.

                        +

                        Scylla Manager 2.0 and higher supports the Consul API.

                        +
                        +

                        Configure Scylla nodes from files

                        +
                          +
                        1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                        2. +
                        +
                        +

                        Note

                        +

                        It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                        +
                        +

                        For example:

                        +
                        - targets:
                        +      - 172.17.0.2
                        +      - 172.17.0.3
                        +  labels:
                        +      cluster: cluster1
                        +      dc: dc1
                        +
                        +
                        +
                        +

                        Note

                        +

                        If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                        +
                        +

                        Using IPV6

                        +

                        To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                        +

                        For example:

                        +
                        - targets:
                        +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                        +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                        +  labels:
                        +      cluster: cluster1
                        +      dc: dc1
                        +
                        +
                        +
                        +

                        Note

                        +

                        For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                        +
                        +

                        For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                        +
                        +

                        Note

                        +

                        By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                        +
                        +

                        If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                        +

                        For example:

                        +
                        ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                        +
                        +
                        +

                        Mark the different Data Centers with Labels.

                        +

                        As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                        +

                        You can use the genconfig.py script to generate the server file. For example:

                        +
                        ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                        +
                        +
                        +

                        This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                        +

                        OR

                        +

                        The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                        +
                        nodetool status | ./genconfig.py -NS
                        +
                        +
                        +

                        2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                        +

                        You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                        +

                        For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                        +
                        # List Scylla Manager end points
                        +
                        +- targets:
                        +  - 172.17.0.7:5090
                        +
                        +
                        +

                        Note that you do not need to add labels to the Scylla Manager targets.

                        +
                        +
                        +

                        Configure Scylla nodes using Scylla-Manager Consul API

                        +

                        Scylla Manager 2.0 has a Consul like API.

                        +

                        When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                        +

                        For example:

                        +
                        ./start-all.sh -L 10.10.0.1
                        +
                        +
                        +
                        +

                        Note

                        +

                        If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                        +
                        +
                        +
                        +

                        Connecting Scylla-Monitoring to Scylla

                        +

                        Scylla-Manager version 3.5 and higher can read tables from a Scylla node using CQL. If your Scylla cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                        +

                        You can limit the user to read only, currently it only read table from the system keyspace.

                        +

                        To set a user/password edit grafana/provisioning/datasources/datasource.yaml.

                        +

                        Under scylla-datasource Uncomment the secureJsonData part and set the user and password.

                        +
                        +
                        +

                        Use an external directory for the Prometheus data directory

                        +

                        The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                        +
                        +

                        Note

                        +

                        Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                        +
                        +

                        If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                        +

                        In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                        +
                        +
                        +

                        Add Additional Prometheus Targets

                        +

                        There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                        +

                        The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                        +

                        You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                        +
                        - job_name: 'myservice'
                        +  # Override the global default and scrape targets from this job every 5 seconds.
                        +  scrape_interval: 5s
                        +  static_configs:
                        +    - targets:
                        +      - 17.0.0.1:7000
                        +
                        +
                        +
                        +
                        +
                        +

                        Start and Stop Scylla Monitoring Stack

                        +
                        +

                        Start

                        +
                        ./start-all.sh -d prometheus_data
                        +
                        +
                        +
                        +
                        +

                        Stop

                        +
                        ./kill-all.sh
                        +
                        +
                        +
                        +
                        +

                        Start a Specific Scylla Monitoring Stack Version

                        +

                        By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                        +

                        You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                        +

                        Multiple versions are supported. For example:

                        +
                        ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                        +
                        +
                        +

                        will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                        +
                        +
                        +

                        Accessing the localhost

                        +

                        The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                        +
                        ./start-all.sh -l -d prometheus-data
                        +
                        +
                        +
                        +
                        +

                        Configure rsyslog on each Scylla node

                        +

                        generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                        +

                        Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                        +

                        Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                        +

                        If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                        +
                        if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                        +
                        +
                        +

                        Restart rsyslog for the configuration to take effect.

                        +
                        systemctl restart rsyslog
                        +
                        +
                        +
                        +
                        +
                        +

                        View Grafana Dashboards

                        +

                        Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/start_all.html b/branch-4.2/install/start_all.html new file mode 100644 index 000000000..18d6fd99c --- /dev/null +++ b/branch-4.2/install/start_all.html @@ -0,0 +1,750 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        The start-all.sh Command

                        +

                        Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                        +

                        The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                        +
                        +

                        General Options

                        +

                        -h Help, Print the help, and exit.

                        +

                        –version print the current Scylla-Monitoring stack version, and exit.

                        +

                        -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                        +

                        -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                        +

                        -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                        +

                        –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                        +
                        + + +
                        +

                        Alert Manager

                        +

                        The Alertmanager handles the alerts and takes the following parameters:

                        +

                        -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                        +

                        -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                        +

                        -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/install/thanos.html b/branch-4.2/install/thanos.html new file mode 100644 index 000000000..3e1de5114 --- /dev/null +++ b/branch-4.2/install/thanos.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Using Thanos as Data Source With Scylla Monitoring Stack

                        +

                        Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                        +
                          +
                        • High-availability.

                        • +
                        • Horizontal scaling.

                        • +
                        • Backup.

                        • +
                        +

                        The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                        +

                        The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                        +
                        +

                        Using Thanos As a Prometheus Aggregator

                        +

                        There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                        +
                        +

                        Prometheus Configuration

                        +

                        We will assume you have two Prometheus servers running.

                        +
                          +
                        1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                        2. +
                        3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                        4. +
                        +
                        +
                        +

                        Thanos sidecar

                        +

                        The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                        +
                        docker run -d \
                        + -v /path/to/prom/dir:/data/prom:z \
                        + -i --name sidecar thanosio/thanos \
                        + sidecar \
                        + --grpc-address=0.0.0.0:10911 \
                        + --grpc-grace-period=1s \
                        + --http-address=0.0.0.0:10912 \
                        + --http-grace-period=1s \
                        + --prometheus.url=http://prometheus-ip:9090 \
                        + --tsdb.path=/data/prom \
                        + -p 10912:10912 \
                        + -p 10911:10911
                        +
                        +
                        +

                        After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                        +
                        +
                        +

                        Thanos query

                        +

                        Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                        +
                        docker run -d \
                        + --name thanos -- thanosio/thanos \
                        +   query \
                        +   --debug.name=query0 \
                        +   --log.level=debug \
                        +   --grpc-address=0.0.0.0:10903 \
                        +   --grpc-grace-period=1s \
                        +   --http-address=0.0.0.0:10904 \
                        +   --http-grace-period=1s \
                        +   --query.replica-label=prometheus \
                        +   --store={ip1}:10911 --store={ip2}:10911
                        +
                        +
                        +

                        After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                        +
                        +
                        +

                        Update Scylla Data source

                        +

                        The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                        +

                        The file you edit is a template file that replaces the file Grafana uses, next time you start.

                        +

                        Restart the Scylla Monitoring Stack it should now use Thanos.

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/intro.html b/branch-4.2/intro.html new file mode 100644 index 000000000..b01cb17aa --- /dev/null +++ b/branch-4.2/intro.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        ScyllaDB Monitoring Stack

                        +

                        ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                        +_images/monitor.png +

                        The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                        +
                          +
                        • prometheus - Collects and stores metrics

                        • +
                        • grafan-loki - Parses logs and generates metrics and alerts

                        • +
                        • alertmanager - Handles alerts

                        • +
                        • grafana - Dashboards server

                        • +
                        +

                        A few optional components are used for additional services

                        +
                          +
                        • grafana-image-renderer - Allows you to download a dashboard as an image.

                        • +
                        • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                        • +
                        +
                        +

                        High Level Architecture

                        +_images/monitoring_stack1.png +

                        We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                        +

                        We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                        +

                        The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                        +

                        We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                        +

                        Choose a topic to get started:

                        + +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/objects.inv b/branch-4.2/objects.inv new file mode 100644 index 000000000..4824b5791 Binary files /dev/null and b/branch-4.2/objects.inv differ diff --git a/branch-4.2/procedures/alerts/alerting.html b/branch-4.2/procedures/alerts/alerting.html new file mode 100644 index 000000000..914e5e9ee --- /dev/null +++ b/branch-4.2/procedures/alerts/alerting.html @@ -0,0 +1,749 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Alerting

                        +

                        Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                        +

                        You can read more about Prometheus alerting here

                        +

                        By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                        +

                        In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                        +

                        The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                        +../../_images/monitoring_stack.png +
                        +

                        Prometheus Alerts

                        +

                        The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                        +

                        Each alert consists of:

                        +
                          +
                        • Name

                        • +
                        • What happened

                        • +
                        • For how long

                        • +
                        • What to report

                        • +
                        +

                        For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                        +
                        - alert: InstanceDown
                        +  expr: up == 0
                        +  for: 60s
                        +  labels:
                        +    severity: "2"
                        +  annotations:
                        +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                        +    summary: Instance {{ $labels.instance }} down
                        +
                        +
                        +

                        The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                        +

                        The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                        +

                        The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                        +

                        annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                        +
                        +
                        +

                        Alertmanager

                        +

                        The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                        +

                        The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                        +
                          +
                        • Routes: Represent a routing tree, the most specific rule, wins

                        • +
                        • Inhibition: Mute an alert, based on another alert

                        • +
                        • Receiver: Send a notification via email, sluck, etc’

                        • +
                        +

                        Check the Alertmanager documentation for details on how to specify a specific receiver.

                        +

                        In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                        +
                        +
                        +

                        Tips When Adding an Alert

                        +

                        It’s worse having an alert that does not work, than not having an alert at all

                        +

                        There are multiple ways you can use to make sure your alert is set correctly:

                        +
                          +
                        • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                        • +
                        • Force the alert to be active by reducing the limits or the duration.

                        • +
                        • When possible simulate the actual scenario and see that the alert works as expected.

                        • +
                        +

                        For example, low available disk space.

                        +

                        Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                        +

                        Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                        +

                        Starting with a simple working expression helps you bisect problems.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/procedures/alerts/index.html b/branch-4.2/procedures/alerts/index.html new file mode 100644 index 000000000..9571c192d --- /dev/null +++ b/branch-4.2/procedures/alerts/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Alert Manager

                        +
                        +
                        +

                        Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/procedures/datadog/index.html b/branch-4.2/procedures/datadog/index.html new file mode 100644 index 000000000..047e15ac7 --- /dev/null +++ b/branch-4.2/procedures/datadog/index.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Datadog Integration

                        +

                        The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                        +
                          +
                        1. Installing and configuring the Datadog Agent.

                        2. +
                        3. Add datadog recording rules.

                        4. +
                        5. Loading Scylla dashboard to Datadog.

                        6. +
                        7. Optionally load Monitor (Alerts).

                        8. +
                        +
                        +

                        Note

                        +

                        Scylla Cloud users, use and update the proper configuration file.

                        +
                        +
                        +

                        Install And configure the Datadog Agent

                        +

                        Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                        +

                        Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                        +
                        +

                        Scylla Cloud Users

                        +

                        Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                        +

                        Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                        +
                        +
                        +

                        Other Scylla Users

                        +

                        Other Scylla users, download the configuration file conf.yaml and replace the ip address of the promemtheus server.

                        +
                        +
                        +

                        Post configuration

                        +

                        Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                        +
                        +
                        +
                        +

                        Add datadog recording rules

                        +

                        Non cloud users, download the rules configuration file datadog.rules.yml and place it under prometheus/prom_rules/.

                        +
                        +
                        +

                        Upload the Dashboard

                        +

                        Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                        +
                        +
                        +

                        Using the Dashboard

                        +

                        We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                        +../../_images/datadog.png +

                        The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                        +
                        +

                        Note

                        +

                        Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                        +
                        +
                        +
                        +

                        Adding Monitor

                        +

                        Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/procedures/index.html b/branch-4.2/procedures/index.html new file mode 100644 index 000000000..a69d7b208 --- /dev/null +++ b/branch-4.2/procedures/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        ScyllaDB Monitoring Stack Procedures

                        +
                        +
                        +

                        There are several reference guides available which give additional information. Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/procedures/updating_dashboard.html b/branch-4.2/procedures/updating_dashboard.html new file mode 100644 index 000000000..3c1f233b2 --- /dev/null +++ b/branch-4.2/procedures/updating_dashboard.html @@ -0,0 +1,958 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Adding and Modifying Dashboards

                        +

                        This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                        +

                        It covers dashboard templates and how to modify them.

                        + +
                        +

                        General Limitations

                        +

                        Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                        +
                        +

                        Consistency Between Restarts

                        +

                        By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                        +
                        +
                        +

                        Consistency Between Upgrades

                        +

                        As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                        +
                        +

                        Note

                        +

                         You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                        +
                        +

                        At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                        +
                        +
                        +
                        +

                        Using Templated Dashboards

                        +

                        Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                        +

                        Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                        +

                        For example a typical graph panel would look like this:

                        +
                        {
                        +    "aliasColors": {},
                        +    "bars": false,
                        +    "datasource": "prometheus",
                        +    "editable": true,
                        +    "error": false,
                        +    "fill": 0,
                        +    "grid": {
                        +        "threshold1": null,
                        +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                        +        "threshold2": null,
                        +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                        +    },
                        +    "gridPos": {
                        +        "h": 6,
                        +        "w": 10,
                        +        "x": 0,
                        +        "y": 4
                        +    },
                        +    "id": 2,
                        +    "isNew": true,
                        +    "legend": {
                        +        "avg": false,
                        +        "current": false,
                        +        "max": false,
                        +        "min": false,
                        +        "show": false,
                        +        "total": false,
                        +        "values": false
                        +    },
                        +    "lines": true,
                        +    "linewidth": 2,
                        +    "links": [],
                        +    "nullPointMode": "connected",
                        +    "percentage": false,
                        +    "pointradius": 5,
                        +    "points": false,
                        +    "renderer": "flot",
                        +    "seriesOverrides": [
                        +        {}
                        +    ],
                        +    "span": 5,
                        +    "stack": false,
                        +    "steppedLine": false,
                        +    "targets": [
                        +        {
                        +            "expr": "sum(node_filesystem_avail) by (instance)",
                        +            "intervalFactor": 1,
                        +            "legendFormat": "",
                        +            "refId": "A",
                        +            "step": 1
                        +        }
                        +    ],
                        +    "timeFrom": null,
                        +    "timeShift": null,
                        +    "title": "Available Disk Size",
                        +    "tooltip": {
                        +        "msResolution": false,
                        +        "shared": true,
                        +        "sort": 0,
                        +        "value_type": "cumulative"
                        +    },
                        +    "transparent": false,
                        +    "type": "graph",
                        +    "xaxis": {
                        +        "show": true
                        +    },
                        +    "yaxes": [
                        +        {
                        +            "format": "percent",
                        +            "logBase": 1,
                        +            "max": 101,
                        +            "min": 0,
                        +            "show": true
                        +        },
                        +        {
                        +            "format": "short",
                        +            "logBase": 1,
                        +            "max": null,
                        +            "min": null,
                        +            "show": true
                        +        }
                        +    ]
                        +}
                        +
                        +
                        +

                        As you can imagine, most panels would have similar values.

                        +

                        To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                        +
                        +

                        The Template Class System

                        +

                        The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                        +

                        The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                        +

                        In the template file, you can also add or override attributes.

                        +

                        The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                        +

                        When generating dashboards, each class will be replaced by its definition.

                        +

                        For example, a row in the type.json is defined as:

                        +
                        {
                        + "base_row": {
                        +     "collapse": false,
                        +     "editable": true
                        + },
                        + "row": {
                        +     "class": "base_row",
                        +     "height": "250px"
                        + }
                        + }
                        +
                        +
                        +

                        Will be used like in a template:

                        +
                        {
                        +     "class": "row",
                        +     "height": "150px",
                        +     "panels": [
                        +     ]
                        +}
                        +
                        +
                        +

                        And the output will be:

                        +
                        {
                        +     "class": "row",
                        +     "collapse": false,
                        +     "editable": true,
                        +     "height": "150px",
                        +     "panels": [
                        +
                        +     ]
                        +}
                        +
                        +
                        +

                        We can see that the template added the panels attribute and that it overrides the height attribute.

                        +
                        +
                        +

                        Panel Example

                        +

                        Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                        +
                        {
                        +     "class": "row",
                        +     "panels": [
                        +         {
                        +             "class": "bytes_panel",
                        +             "span": 3,
                        +             "targets": [
                        +                 {
                        +                     "expr": "sum(node_filesystem_avail) by (instance)",
                        +                     "intervalFactor": 1,
                        +                     "legendFormat": "",
                        +                     "metric": "",
                        +                     "refId": "A",
                        +                     "step": 1
                        +                 }
                        +             ],
                        +             "title": "Available Disk Size"
                        +         }
                        +     ]
                        +}
                        +
                        +
                        +

                        In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                        +

                        You can also see that the span attribute is overridden to set the panel size.

                        +

                        To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                        +
                        +
                        +

                        Grafana Formats and Layouts

                        +

                        The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                        +

                        Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                        +

                        The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                        +

                        To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                        +

                        The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                        +

                        You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                        +

                        gridPos has the following attributes:

                        +
                        {
                        +   "x": 0,
                        +   "y": 0,
                        +   "w": 24,
                        +   "h": 4
                        + }
                        +
                        +
                        +

                        When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                        +
                        {
                        +   "gridPos": {
                        +      "h": 2
                        +    }
                        +}
                        +
                        +
                        +
                        +
                        +

                        Generating the dashboards from templates (generate-dashboards.sh)

                        +
                        +

                        Prerequisite

                        +

                        Python 2.7

                        +

                        make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                        +

                        Use the -h flag to get help information.

                        +

                        You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                        +

                        When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                        +

                        For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                        +

                        .\generate-dashboards.sh -v 2020.1

                        +
                        +

                        Note

                        +

                        generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                        +
                        +
                        +
                        +
                        +

                        Validation

                        +

                        After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                        +

                        Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/reference/index.html b/branch-4.2/reference/index.html new file mode 100644 index 000000000..dcf8625cb --- /dev/null +++ b/branch-4.2/reference/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Reference Guide

                        +
                        +
                        +

                        There are several reference guides available which give additional information. Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/reference/matrix.html b/branch-4.2/reference/matrix.html new file mode 100644 index 000000000..8cf2019f0 --- /dev/null +++ b/branch-4.2/reference/matrix.html @@ -0,0 +1,830 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Support Matrix

                        +

                        The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                        + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                        Scylla Monitoring Stack Version

                        Scylla Open Source Version

                        Scylla Enterprise Version

                        Node_exporter[1] Version

                        Scylla Manager Version

                        4.3

                        5.0,5.1,5.2

                        2020.1, 2021.1, 2022.1, 2022.2

                        1.4.1

                        2.5, 2.6, 3.0

                        4.2

                        4.5,4.6,5.0,5.1

                        2020.1, 2021.1, 2022.1, 2022.2

                        1.4.1

                        2.5, 2.6, 3.0

                        4.1

                        4.5,4.6,5.0,5.1

                        2020.1, 2021.1, 2022.1, 2022.2

                        0.17

                        2.5, 2.6, 3.0

                        4.0

                        4.3, 4.4, 4.5, 4.6, 5.0

                        2020.1, 2021.1, 2022.1

                        0.17

                        2.3, 2.4, 2.5, 2.6, 3.0

                        3.11

                        4.3, 4.4, 4.5, 4.6, 5.0

                        2020.1, 2021.1, 2022.2

                        0.17

                        2.3, 2.4, 2.5, 2.6

                        3.10

                        4.3, 4.4, 4.5, 4.6

                        2020.1, 2021.1

                        0.17

                        2.3, 2.4, 2.5, 2.6

                        3.9

                        4.3, 4.4, 4.5, 4.6

                        2020.1, 2021.1

                        0.17

                        2.3, 2.4, 2.5

                        3.8

                        4.3, 4.4, 4.5

                        2020.1, 2021.1

                        0.17

                        2.3, 2.4, 2.5

                        3.7

                        4.2, 4.3, 4.4

                        2019.1, 2020.1, 2021.1

                        0.17

                        2.2, 2.3

                        3.6.3

                        4.2, 4.3, 4.4

                        2019.1, 2020.1, 2021.1

                        0.17

                        2.2, 2.3, 2.1

                        3.6

                        4.1, 4.2, 4.3

                        2019.1, 2020.1

                        0.17

                        2.1, 2.2, 2.3

                        3.6.1

                        4.1, 4.2, 4.3

                        2019.1, 2020.1

                        0.17

                        2.1, 2.2

                        3.6.1

                        4.1, 4.2, 4.3, 4.4

                        2019.1, 2020.1

                        0.17

                        2.1, 2.2

                        3.5

                        3.3, 4.0, 4.1, 4.2

                        2019.1, 2020.1

                        0.17

                        2.0, 2.1, 2.2

                        3.4.3

                        3.3, 4.0, 4.1, 4.2

                        2019.1, 2020.1

                        0.17

                        2.0, 2.1

                        3.4

                        3.3, 4.0, 4.1

                        2018.1, 2019.1

                        0.17

                        2.0, 2.1

                        3.3

                        3.1, 3.2, 3.3, 4.0

                        2018.1, 2019.1

                        0.17

                        1.4, 2.0, 2.1

                        3.2

                        3.1, 3.2, 3.3

                        2018.1, 2019.1

                        0.17

                        1.4, 2.0

                        3.1

                        2.3, 3.0, 3.1, 3.2

                        2018.1, 2019.1

                        0.17

                        1.3, 1.4, 2.0

                        3.0

                        2.3, 3.0, 3.1, 3.2

                        2018.1, 2019.1

                        0.17

                        1.3, 1.4

                        2.4

                        2.3, 3.0, 3.1

                        2018.1, 2019.1

                        0.14, 0.17

                        1.3, 1.4

                        2.3

                        2.3, 3.0

                        2018.1, 2019.1

                        0.14, 0.17

                        1.3

                        2.2

                        2.3, 3.0

                        2018.1, 2019.1

                        0.14, 0.17

                        1.3

                        2.1

                        2.3, 3.0

                        2018.1

                        0.14, 0.17

                        1.3

                        +

                        [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/reference/monitoring_apis.html b/branch-4.2/reference/monitoring_apis.html new file mode 100644 index 000000000..305affae3 --- /dev/null +++ b/branch-4.2/reference/monitoring_apis.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Interfaces

                        +

                        Scylla exposes two interfaces for online monitoring, as described below

                        +
                        +

                        Prometheus

                        +

                        By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                        +

                        For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                        +

                        You can change the Prometheus listening address and port in scylla.yaml file

                        +
                        # prometheus port
                        +# By default, Scylla opens prometheus API port on port 9180
                        +# setting the port to 0 will disable the prometheus API.
                        +prometheus_port: 9180
                        +#
                        +# prometheus address
                        +# By default, Scylla binds all interfaces to the prometheus API
                        +# It is possible to restrict the listening address to a specific one
                        +prometheus_address: 0.0.0.0
                        +
                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/robots.txt b/branch-4.2/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.2/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.2/search.html b/branch-4.2/search.html new file mode 100644 index 000000000..2ede37661 --- /dev/null +++ b/branch-4.2/search.html @@ -0,0 +1,643 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + + + +
                        + + + + + +
                        + + +
                        + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/searchindex.js b/branch-4.2/searchindex.js new file mode 100644 index 000000000..9b7af2adb --- /dev/null +++ b/branch-4.2/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "2": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 6, 19, 22, 24, 25, 29, 30, 32, 33, 35, 37, 38], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 26, 27, 28, 29, 32, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 26], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 29, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 27, 28, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 26, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 27, 34, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 33], "user": [1, 2, 6, 7, 9, 26, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9, 32], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 28, 29], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 26, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 19, 21, 22, 23, 24, 25, 29, 31, 33, 34, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 29, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 26, 30, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 31, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 27, 30, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 26, 29, 32, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 14, 19, 21, 22, 23, 24, 25], "onc": [2, 12, 21, 25, 31, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 19, 21, 22, 23, 24, 25, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 34, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 32, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 30, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 27, 29, 30, 33, 34, 35, 41], "both": [2, 5, 6, 19, 22, 24, 25, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 26, 39, 41], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 28, 33, 34, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 34, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 27, 33, 34, 41], "advis": [2, 34], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25], "databas": [2, 5, 7, 21, 29, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 30, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 32, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 32, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 31, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 6, 12, 17], "To": [2, 4, 5, 6, 14, 17, 21, 22, 23, 24, 25], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 27, 28, 29, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 10, 14, 16, 17, 21, 22, 23, 24, 25], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 14, 16], "3": [2, 4, 5, 6, 14, 16, 20, 35], "5": [2, 5, 6, 14, 16, 19], "3000": [2, 5, 6, 22, 24, 25], "1000": [2, 33], "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 14, 28, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25], "dir": [2, 7, 8, 22, 24, 25], "loki": [2, 6, 9], "mnt": 2, "3100": [2, 5], "rule": [2, 5, 7, 10, 25, 31, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 27, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 29, 34, 35, 37, 39, 41], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 21, 33, 39], "section": [4, 5, 6, 12, 19, 21, 24, 25, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 29, 35, 37, 41], "default": [4, 5, 6, 7, 10, 14, 17, 19, 21, 23, 25, 30, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25], "scrape": [4, 5, 6], "interv": [4, 5, 6], "20": [4, 5, 6, 38], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 27, 28, 29, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 32, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 27, 29, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 29, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 31, 39, 41], "need": [4, 5, 6, 7, 8, 14, 19, 25, 27, 28, 29, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 27, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 27, 34, 41], "out": [4, 5, 6, 8, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 26, 29, 41], "take": [4, 5, 6, 7, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25], "help": [5, 7, 10, 14, 41], "pleas": [5, 19], "most": [5, 10, 14, 25, 34, 36, 41], "current": [5, 6, 7, 10, 14, 19, 22, 24, 25], "common": [5, 7, 41], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 19], "standalon": 5, "thei": [5, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 27, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 27, 28, 35, 41], "support": [5, 6, 14, 15, 26, 32, 41], "want": [5, 6, 10, 22, 24, 25], "latest": [5, 6, 7, 22, 24, 25], "releas": [5, 21, 22, 23, 24, 25], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25], "http": [5, 6, 8, 19, 21, 22, 24, 25, 29, 30, 32, 38], "com": [5, 6, 22, 24, 25, 29, 30, 32, 38], "archiv": [5, 6, 22, 24, 25], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 21, 22, 23, 24], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25], "p": [5, 7, 8, 19, 21, 22, 24, 25], "home": 5, "cd": [5, 6, 22, 24, 25], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25], "browser": [5, 6, 8, 14, 19, 22, 24, 25], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 31, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 12, 19, 25, 26, 29, 30, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 27, 30, 31, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 29, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 14, 26, 27, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25], "scrap": 5, "job": [5, 6, 19], "onli": [5, 6, 7, 21, 23, 25, 29, 31, 33, 39, 41], "import": [5, 6, 7, 12, 21, 22, 24, 25, 33], "record": [5, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25], "code": [5, 34], "shell": 5, "prom_rul": [5, 12, 25], "correct": [5, 23], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 32], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 34, 41], "typic": [5, 14, 25, 27, 29, 39, 41], "node_export": [5, 6, 7, 9, 16], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 14, 17, 19, 21, 23, 30, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 26, 31], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24], "scylla_reactor_util": 5, "At": [5, 14, 24, 25], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 6, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 27, 28, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 25, 34, 38], "tabl": [5, 6, 10, 16, 26, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 33, 34, 41], "give": [5, 13, 15], "strongli": 5, "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 26, 29, 34, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 31, 33], "mention": [5, 14], "previous": [5, 24, 25], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 30, 33, 41], "privileg": [5, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 25], "laptop": 6, "41": 6, "9": [6, 16, 25], "38": 6, "34": 6, "8": [6, 16, 21, 25], "11": [6, 16], "32": 6, "10": [6, 10, 14, 16], "29": 6, "25": [6, 19], "avoid": [6, 14, 19, 30, 32, 41], "root": [6, 19, 22, 24, 25], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 29, 41], "higher": [6, 25, 29, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 26, 27, 28], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25], "within": [6, 10, 14], "protect": 6, "assign": 6, "place": [6, 7, 8, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 27, 29, 30, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25], "2019": [6, 16, 38], "reach": [6, 8, 12, 29, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 29, 30, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 28, 31, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 29, 30, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "variabl": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 26, 27, 28, 29, 30, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 34], "disk": [7, 10, 14, 19, 26, 28, 34], "possibl": [7, 10, 17, 32, 41], "api": [7, 8, 17, 21], "resolv": 7, "explicitli": [7, 14], "request": [7, 17, 34, 40], "how": [7, 8, 10, 14, 22, 24, 25, 27, 28, 29, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14, 34], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 28], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 27, 28, 29, 34, 35, 41], "abov": [8, 22, 24, 25], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 29, 38, 41], "email": [9, 10], "slack": [9, 10], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11, 34], "wrong": [10, 11, 14, 19, 25, 39, 41], "shown": [10, 19, 22, 24, 25], "overview": [10, 25, 34], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 32, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 42], "annot": 10, "descript": [10, 34], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 41], "rout": [10, 29, 41], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 27], "simul": 10, "actual": [10, 37], "low": [10, 41], "space": 10, "lower": [10, 41], "fire": 10, "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 31, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "promemtheu": 12, "non": [12, 19, 21, 28, 29, 34, 38, 41], "json": [12, 14], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "shard": [12, 19, 25, 34], "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "explain": [14, 22, 24, 25, 34], "intern": [14, 29, 41], "potenti": [14, 34, 41], "issu": [14, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 34, 35, 37], "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 30, 41], "tooltip": 14, "msresolut": 14, "share": [14, 33], "sort": [14, 32, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 32, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 30, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 23, 25], "calcul": [14, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "24": [14, 25], "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": [14, 34], "usual": [14, 19, 34, 41], "easier": 14, "wrapper": 14, "re": [14, 29], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2018": [16, 30], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "56090": 19, "old": [19, 22, 23, 24, 25], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 34, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": [19, 34], "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 29, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 26, 27, 28, 30, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "while": [19, 21, 22, 24, 25, 33], "increas": [19, 30, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25], "migrat": [21, 22, 24], "lose": 21, "histor": [21, 25], "process": [21, 33, 40], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25], "3001": [21, 22, 24, 25], "9091": [21, 22, 24, 25], "9094": 21, "fail": [21, 27, 29, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25], "back": [21, 27], "recommend": [22, 24, 25], "uninstal": [22, 24, 25], "minor": [22, 24, 25], "9095": [22, 24, 25], "brows": [22, 24, 25], "satisfi": [22, 24, 25], "shut": [22, 24, 25], "caus": [22, 24, 25, 29, 41], "blackout": [22, 24, 25], "normal": [22, 24, 25], "dure": [22, 24, 25], "oper": [22, 24, 25, 34, 41], "complet": [22, 24, 25], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 34, 41], "newer": [24, 25], "ensur": 25, "patch": 25, "skip": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 28], "latenc": [25, 29, 33, 34, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 27], "mechan": [25, 27], "present": 25, "reli": [25, 41], "miss": 25, "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 27, 28, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "primari": [26, 41], "kei": [26, 32, 41], "scan": 26, "These": [26, 41], "kind": [26, 41], "bigger": 26, "care": [26, 27, 28, 41], "replicationfactor": [27, 28], "piec": 27, "determin": [27, 28, 35, 41], "repli": [27, 28, 30, 35, 37, 41], "unavail": [27, 41], "client": [27, 30, 34, 41], "respond": 27, "accompani": 27, "deep": 27, "understand": 27, "acknowledg": 28, "coordin": [28, 29, 35, 37, 41], "hint": 28, "fact": 28, "yet": 28, "ideal": [29, 41], "resourc": [29, 32, 41], "replic": [29, 35, 37, 41], "prepar": [29, 34, 38], "statement": [29, 31, 34, 38], "balanc": [29, 33, 34, 41], "polici": 29, "cours": 29, "intro": 29, "recap": 29, "ring": [29, 41], "architectur": 29, "chunk": [30, 41], "overal": [30, 33, 41], "thu": 30, "www": [30, 38], "07": 30, "13": 30, "effici": [30, 41], "optim": [31, 38, 42], "concret": 31, "thumb": 31, "alwai": 31, "favor": 31, "partit": [32, 34], "BY": [32, 41], "ineffici": [32, 41], "consum": 32, "doc": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "practic": [34, 38], "solv": 34, "left": 34, "categori": [34, 41], "jump": 34, "warn": 34, "cell": 34, "model": [34, 38, 40, 41], "imbal": 34, "imbalanc": 34, "hot": 34, "bottleneck": [34, 38], "cach": 34, "hit": 34, "awar": 34, "order": [34, 41], "due": 34, "unsatisfi": 34, "faulti": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "explan": 38, "08": 38, "best": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "drop": [40, 41], "repair": 40, "que": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "prevent": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "cost": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 9, 13], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 34, 42], "us": [2, 5, 6, 8, 12, 14, 26, 27, 28, 32, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 30, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 34, 41], "all": [7, 22, 24, 25, 27], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 26, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 27, 28, 35, 41], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25], "modifi": 14, "limit": 14, "consist": [14, 27, 28, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "reduc": 19, "total": 19, "number": 19, "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25], "latest": 21, "new": [21, 22, 23, 24, 25], "4": [21, 25], "move": [21, 22, 24, 25], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25], "link": [21, 22, 23, 24, 25, 28, 29, 30, 32, 38], "y": [22, 24, 25], "": [22, 24, 25], "i": [22, 24, 25, 36], "run": [22, 24, 25], "correct": [22, 24, 25], "correctli": [22, 24], "kill": [22, 24, 25], "test": [24, 25], "mode": [24, 25], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [26, 27, 28, 29, 30, 31, 32, 35, 37], "allow": [26, 41], "filter": [26, 41], "ani": 28, "univers": [28, 29], "ar": [29, 30, 31, 38], "token": [29, 41], "awar": [29, 41], "select": 30, "non": [30, 31], "page": [30, 41], "blog": [30, 38], "prepar": [31, 39, 41], "revers": [32, 41], "order": 32, "document": 32, "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some queries use reverse order": [[32, "some-queries-use-reverse-order"]], "Documentation link": [[32, "documentation-link"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Some SELECT queries are non-paged": [[30, "some-select-queries-are-non-paged"]], "Blog-post Links": [[30, "blog-post-links"]], "Some queries are non-prepared": [[31, "some-queries-are-non-prepared"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "Upgrade Procedure": [[21, "upgrade-procedure"], [22, "upgrade-procedure"], [23, "upgrade-procedure"], [25, "upgrade-procedure"], [24, "upgrade-procedure"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[21, "install-the-new-monitoring-stack"], [23, "install-the-new-monitoring-stack"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Validate the upgrade": [[21, "validate-the-upgrade"], [23, "validate-the-upgrade"]], "Rollback": [[21, "rollback"], [23, "rollback"]], "Related Links": [[21, "related-links"], [22, "related-links"], [23, "related-links"], [25, "related-links"], [24, "related-links"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[22, "setting-the-server-s-files"], [25, "setting-the-server-s-files"], [24, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[22, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[22, "kill-all-containers"], [25, "kill-all-containers"], [24, "kill-all-containers"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "Some queries use Consistency Level: ANY": [[28, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[28, "link-to-scylla-university"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Rollback to version 3.x": [[25, "rollback-to-version-3-x"], [24, "rollback-to-version-3-x"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Some queries are not token-aware": [[29, "some-queries-are-not-token-aware"]], "University link": [[29, "university-link"]], "Some queries use Consistency Level: ALL": [[27, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Some queries use ALLOW FILTERING": [[26, "some-queries-use-allow-filtering"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[17, "prometheus"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "System Overload": [[40, "system-overload"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "ScyllaDB Monitoring Stack": [[1, "scylladb-monitoring-stack"], [9, "scylladb-monitoring-stack"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Minimal Production System Recommendations": [[6, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[6, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[6, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to Scylla": [[6, "connecting-scylla-monitoring-to-scylla"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "High Level Architecture": [[9, "high-level-architecture"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.2/sitemap.xml b/branch-4.2/sitemap.xml new file mode 100644 index 000000000..b83fd372f --- /dev/null +++ b/branch-4.2/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.2/troubleshooting/index.html b/branch-4.2/troubleshooting/index.html new file mode 100644 index 000000000..95b477cd7 --- /dev/null +++ b/branch-4.2/troubleshooting/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Troubleshooting Guide for Scylla Monitoring Stack

                        +
                        +
                        +

                        Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/troubleshooting/monitor_troubleshoot.html b/branch-4.2/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..7e3b4aeac --- /dev/null +++ b/branch-4.2/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,875 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Troubleshoot Scylla Monitoring Stack

                        +

                        This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                        +
                        +

                        Problem

                        +
                        +

                        Scylla-Manager 2.2 with Duplicate information

                        +

                        Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                        +
                          +
                        • For Manager server: from 56090 to 5090

                        • +
                        • For Manager Agent: from 56090 to 5090

                        • +
                        +

                        For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                        +

                        However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                        +

                        The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                        +

                        Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                        +
                        +
                        +

                        A Container Fails To Start

                        +

                        When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                        +
                        Wait for Prometheus container to start........Error: Prometheus container failed to start
                        +
                        +
                        +

                        Should this happen, check the Docker logs for more information.

                        +
                        docker logs aprom
                        +
                        +
                        +

                        Usually the reason for the failure is described in the logs.

                        +
                        +
                        +

                        Files And Directory Permissions

                        +
                        +

                        Note

                        +

                        Avoid running Docker containers as root.

                        +
                        +

                        The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                        +

                        If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                        +
                        +

                        Note

                        +

                        If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                        +
                        +

                        For example if your Prometheus data directory is /prom-data and you are using centos user

                        +
                        ls -la /|grep prom-data
                        +
                        +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                        +
                        +sudo chown -R centos:centos /prom-data
                        +
                        +ls -la /|grep prom-data
                        +
                        +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                        +
                        +
                        +
                        +
                        +

                        No Data Points

                        +

                        No data points on all data charts.

                        +
                        +

                        Solution

                        +

                        If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                        +
                          +
                        1. Login to the Prometheus console:

                        2. +
                        3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                        4. +
                        5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                        6. +
                        +
                        +
                          +
                        • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                        • +
                        • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                        • +
                        • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                        • +
                        +
                        +

                        For example:

                        +
                        ./start-all.sh -v 3.1
                        +
                        +
                        +

                        More on start-all.sh options.

                        +
                        +
                        +
                        +

                        Grafana Chart Shows Error (!) Sign

                        +

                        Run this procedure on the Scylla Monitoring Stack server.

                        +

                        If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                        +
                        +

                        Solution

                        +

                        On the Scylla Monitoring Stack server:

                        +
                          +
                        1. Check Prometheus is running using docker ps.

                        2. +
                        +
                          +
                        • If it is not running check the prometheus.yml for errors.

                        • +
                        +

                        For example:

                        +
                        CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                        +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                        +
                        +
                        +
                          +
                        • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                        • +
                        +
                        +
                        +
                        +

                        Grafana Shows Server Level Metrics, but not Scylla Metrics

                        +

                        Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                        +
                        +

                        Solution

                        +
                          +
                        • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                        • +
                        +

                        For example

                        +
                        curl 172.17.0.2:9180/metrics
                        +
                        +
                        +
                        +
                        +
                        +

                        Grafana Shows Scylla Metrics, but not Server Level Metrics

                        +

                        Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                        +
                        +

                        Solution

                        +

                        1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                        +
                          +
                        1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                        2. +
                        +
                        +
                        +

                        Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                        +

                        While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                        +

                        If the node_exporter service is not starting it may need to be updated manually.

                        +

                        Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                        +
                        +
                        +
                        +

                        Reducing the total number of metrics

                        +

                        In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                        +
                        +

                        Remove interrupts from node_exporter

                        +

                        By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                        +
                        +
                        +
                        +

                        Working with Wireshark

                        +

                        No metrics shown in the Scylla Monitoring Stack.

                        +
                          +
                        1. Install wireshark

                        2. +
                        +

                        2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                        +

                        For example:

                        +
                        tshark -i eth0 -f "dst port 9180"
                        +
                        +
                        +

                        Capture from Scylla node towards Scylla Monitoring Stack server.

                        +

                        In this example, Scylla is running.

                        +
                        Monitor ip        Scylla node ip
                        +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                        +
                        +
                        +

                        In this example, Scylla is not running

                        +
                        Monitor ip        Scylla node ip
                        +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                        +
                        +
                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/index.html b/branch-4.2/upgrade/index.html new file mode 100644 index 000000000..c893477fc --- /dev/null +++ b/branch-4.2/upgrade/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Scylla Monitoring Stack

                        +
                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..e5c54efc9 --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                        +

                        Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                        +
                        +

                        Upgrade Procedure

                        +
                        +

                        1. Upgrade to the latest 1.x version

                        +

                        Before starting the upgrade procedure, make sure you are running the latest 1.x version

                        +
                        +
                        +

                        2. Install the new monitoring stack

                        +
                          +
                        1. Download the 2.x version from the release page.

                        2. +
                        3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                        4. +
                        5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                          +
                            +
                          • scylla_servers.yml

                          • +
                          • scylla_manager_servers.yml

                          • +
                          • node_exporter_servers.yml

                          • +
                          +
                        6. +
                        7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                        8. +
                        +
                        ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                        +
                        +
                        +
                        +

                        Note

                        +

                        Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                        +
                        +

                        While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                        +
                        ./kill-all.sh -g 3001 -p 9091 -m 9094
                        +
                        +
                        +
                        +

                        Validation

                        +

                        Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                        +
                        +
                        +
                        +

                        3. Alerting Rules

                        +

                        Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                        +
                        +
                        +

                        4. Moving to Prometheus 2.x

                        +

                        Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                        +

                        Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                        +
                        +

                        a. Set the old system

                        +

                        The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                        +
                          +
                        • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                        • +
                        • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                        • +
                        +
                        +

                        Note

                        +

                        After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                        +
                        +
                        +
                        +

                        b. Set the new system

                        +

                        The following step will allow the new monitoring system to read historical metrics from the old system.

                        +
                          +
                        • In the Prometheus prometheus.yml.template file add the following at the end:

                        • +
                        +
                        remote_read:
                        +  - url: "http://{ip}:9111/api/v1/read"
                        +
                        +
                        +

                        Where {ip} is the ip of the old system.

                        +
                          +
                        • restart the new stack

                        • +
                        +
                        +
                        +
                        +

                        Validate the upgrade

                        +

                        You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                        +
                        +
                        +
                        +

                        Rollback

                        +

                        In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..0541889e3 --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                        +
                        +

                        Upgrade Procedure

                        +

                        We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                        +

                        Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                        +
                        +

                        Install 2.y (The new version)

                        +
                        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                        +unzip scylla-monitoring-2.y.zip
                        +cd scylla-monitoring-scylla-monitoring-2.y/
                        +
                        +
                        +

                        Replace “y” with the new minor release number, for example, 2.1.zip

                        +
                        +
                        +

                        Setting the server’s files

                        +

                        Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                        +
                        cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                        +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                        +
                        +
                        +
                        +
                        +

                        Validate the new version is running the correct version

                        +

                        Starting from Scylla-Monitoring version 2.2, you can run:

                        +
                        ./start-all.sh --version
                        +
                        +
                        +

                        To validate the Scylla-Monitoring version.

                        +
                        +
                        +

                        Validate the version installed correctly

                        +

                        To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                        +
                        ./start-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        Browse to http://{ip}:9091 +And check the Grafana dashboard

                        +

                        Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                        +
                        +

                        Caution

                        +

                        Important: do not use the local dir flag when testing!

                        +
                        +

                        When you are satisfied with the data in the dashboard, you can shut down the containers.

                        +
                        +

                        Caution

                        +

                        Important: Do not kill the 2.x version that is currently running.

                        +
                        +

                        Use the following command to kill the containers:

                        +
                        ./kill-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        You can start and stop the new 2.y version while testing.

                        +
                        +
                        +

                        Move to version 2.y (the new version)

                        +

                        Note: migrating will cause a few seconds of blackout in the system.

                        +

                        We assume that you are using external volume to store the metrics data.

                        +
                        +

                        Kill all containers

                        +

                        Follow the instruction on how to kill the 2.y version when in testing mode.

                        +

                        To kill the 2.x version containers, run:

                        +
                        ./kill-all.sh
                        +
                        +
                        +

                        Start version 2.y in normal mode

                        +

                        From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                        +
                        ./start-all.sh -d /path/to/data/dir
                        +
                        +
                        +

                        Point your browser to http://{ip}:3000 and see that the data is there.

                        +
                        +
                        +
                        +

                        Rollback to version 2.x

                        +

                        To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                        +

                        To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                        +
                        ./kill-all.sh
                        +cd /path/to/scylla-grafana-2.x/
                        +./start-all.sh -d /path/to/data/dir
                        +
                        +
                        +
                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..9ff6e3b55 --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,752 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                        +

                        Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                        +
                        +

                        Upgrade Procedure

                        +
                        +

                        1. Validate node_exporter version

                        +

                        Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                        +

                        If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                        +
                        +
                        +

                        2. Install the new monitoring stack

                        +
                          +
                        1. Download the 3.x version from the release page.

                        2. +
                        3. Unzip it into a different directory.

                        4. +
                        5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                          +
                            +
                          • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                          • +
                          • scylla_manager_servers.yml

                          • +
                          +
                          +
                          +

                          Note

                          +

                          The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                          +
                          +
                          +
                        6. +
                        7. Stop the old monitoring stack

                          +
                          +
                          ./kill-all.sh
                          +
                          +
                          +
                          +
                        8. +
                        9. Start the new monitoring stack

                          +
                          +
                          ./start-all.sh -d /prometheus-data-path
                          +
                          +
                          +
                          +
                        10. +
                        +
                        +
                        +

                        Validate the upgrade

                        +

                        You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                        +

                        Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                        +
                        +
                        +
                        +

                        Rollback

                        +

                        To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..6c0351a87 --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                        +
                        +

                        Upgrade Procedure

                        +

                        We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                        +

                        Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                        +
                        +

                        Install 3.y (The new version)

                        +
                        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                        +unzip scylla-monitoring-3.y.zip
                        +cd scylla-monitoring-scylla-monitoring-3.y/
                        +
                        +
                        +

                        Replace “y” with the new minor release number, for example, 3.0.1.zip

                        +
                        +
                        +

                        Setting the server’s files

                        +

                        Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                        +
                        cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                        +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                        +
                        +
                        +
                        +
                        +

                        Validate the new version is running the correct version

                        +

                        Starting from Scylla-Monitoring version 2.2, you can run:

                        +
                        ./start-all.sh --version
                        +
                        +
                        +

                        To validate the Scylla-Monitoring version.

                        +
                        +
                        +

                        Validate the version installed correctly

                        +

                        To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                        +
                        ./start-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        Browse to http://{ip}:9091 +And check the Grafana dashboard

                        +

                        Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                        +
                        +

                        Caution

                        +

                        Important: do not use the local dir flag when testing!

                        +
                        +

                        When you are satisfied with the data in the dashboard, you can shut down the containers.

                        +
                        +

                        Caution

                        +

                        Important: Do not kill the 3.x version that is currently running.

                        +
                        +
                        +
                        +

                        Killing the new 3.y Monitoring stack in testing mode

                        +

                        Use the following command to kill the containers:

                        +
                        ./kill-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        You can start and stop the new 3.y version while testing.

                        +
                        +
                        +

                        Move to version 3.y (the new version)

                        +

                        Note: migrating will cause a few seconds of blackout in the system.

                        +

                        We assume that you are using external volume to store the metrics data.

                        +
                        +

                        Kill all containers

                        +

                        At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                        +

                        Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                        +

                        kill the older 3.x version containers by running:

                        +
                        ./kill-all.sh
                        +
                        +
                        +

                        Start version 3.y in normal mode

                        +

                        From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                        +
                        ./start-all.sh -d /path/to/data/dir
                        +
                        +
                        +

                        Point your browser to http://{ip}:3000 and see that the data is there.

                        +
                        +
                        +
                        +

                        Rollback to version 3.x

                        +

                        To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                        +

                        To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                        +
                        ./kill-all.sh
                        +cd /path/to/scylla-grafana-3.x/
                        +./start-all.sh -d /path/to/data/dir
                        +
                        +
                        +
                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..920babdee --- /dev/null +++ b/branch-4.2/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,939 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                        +

                        This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                        +
                        +

                        Upgrade Procedure

                        +

                        We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                        +

                        Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                        +
                        +

                        Install 4.y (The new version)

                        +
                        wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                        +unzip scylla-monitoring-4.y.zip
                        +cd scylla-monitoring-scylla-monitoring-4.y/
                        +
                        +
                        +

                        Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                        +
                        +
                        +

                        Setting the server’s files

                        +

                        Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                        +
                        cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                        +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                        +
                        +
                        +
                        +
                        +

                        Validate the new version is running the correct version

                        +

                        run:

                        +
                        ./start-all.sh --version
                        +
                        +
                        +

                        To validate the Scylla-Monitoring version.

                        +
                        +
                        +
                        +

                        Running in test mode

                        +

                        This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                        +
                        +

                        Running second monitoring stack

                        +

                        We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                        +
                        ./start-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        Browse to http://{ip}:9091 and check the Grafana dashboard.

                        +

                        Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                        +
                        +

                        Caution

                        +

                        Important: do not use the local dir flag when testing!

                        +
                        +

                        When you are satisfied with the data in the dashboard, you can shut down the containers.

                        +
                        +

                        Caution

                        +

                        Important: Do not kill the 3.x version that is currently running!

                        +
                        +
                        +
                        +

                        Killing the new 4.y Monitoring stack in testing mode

                        +

                        Use the following command to kill the containers:

                        +
                        ./kill-all.sh -p 9091 -g 3001 -m 9095
                        +
                        +
                        +

                        You can start and stop the new 4.y version while testing.

                        +
                        +
                        +
                        +

                        Migrating

                        +
                        +

                        Move to version 4.y (the new version)

                        +

                        Note: migrating will cause a few seconds of blackout in the system.

                        +

                        We assume that you are using external volume to store the metrics data.

                        +
                        +

                        Backup

                        +

                        We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                        +
                        +
                        +

                        Kill all containers

                        +

                        At this point you have two monitoring stacks installed with the older version running.

                        +

                        If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                        +

                        kill the older 3.x version containers by running:

                        +
                        ./kill-all.sh
                        +
                        +
                        +

                        Start version 4.y in normal mode

                        +

                        From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                        +
                        ./start-all.sh -d /path/to/copy/data/dir
                        +
                        +
                        +

                        Point your browser to http://{ip}:3000 and see that the data is there.

                        +
                        +
                        +
                        +

                        Rollback to version 3.x

                        +

                        To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                        +

                        To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                        +
                        ./kill-all.sh
                        +cd /path/to/scylla-grafana-3.x/
                        +./start-all.sh -d /path/to/original/data/dir
                        +
                        +
                        +
                        +
                        +
                        +

                        Post-installation: Metrics back-filling

                        +

                        Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                        +

                        For example, this is a recording rule that calculates the p99 write latency:

                        +
                        - record: wlatencyp99
                        +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                        +  labels:
                        +    by: "instance,shard"
                        +
                        +
                        +

                        For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                        +

                        Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                        +
                        +
                        +

                        Note

                        +

                        If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                        +
                        +
                        +
                        +../_images/before-backfilling.png +
                        +

                        This is an example of missing latency graph

                        +
                        +
                        +

                        The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                        +

                        For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                        +

                        In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                        +

                        The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                        +
                        +

                        Determine the backfilling period

                        +

                        When you run the backfilling process you need to determine the start time and end time.

                        +
                        +

                        Determine the start time

                        +

                        The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                        +

                        If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                        +

                        For the rest of this example, we will assume that your retention time is 360 days.

                        +
                        +
                        +

                        Determine the end time

                        +

                        Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                        +

                        If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                        +

                        That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                        +

                        The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                        +
                        +
                        +
                        +

                        Backfilling Process

                        +
                        +

                        backup

                        +

                        If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                        +

                        To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                        +
                        +
                        +

                        Restart the monitoring stack

                        +

                        You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                        +

                        -b "--storage.tsdb.allow-overlapping-blocks"

                        +
                        +
                        +

                        Create the data files

                        +

                        We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                        +

                        The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                        +

                        Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                        +
                        docker exec -it aprom sh
                        +cd /prometheus/data/
                        +promtool tsdb create-blocks-from rules \
                        +--start $start \
                        +--end $end \
                        +--url http://localhost:9090 \
                        +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                        +
                        +
                        +

                        It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                        +
                        +
                        +

                        Note

                        +

                        Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                        +
                        +
                        +
                        +
                        +

                        Copy the data files

                        +

                        Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                        +

                        Copy the data files to the Prometheus directory:

                        +
                        cp data/* .
                        +
                        +
                        +

                        The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                        +

                        Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                        +
                        +../_images/after-backfilling.jpg +
                        +

                        Un example: after loading half of the data

                        +
                        +
                        +
                        +
                        +
                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.2/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..6d2549ab8 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries use ALLOW FILTERING

                        +

                        Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                        +

                        These kinds of queries can create a bigger load on Scylla, and should be used with care.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlCLAll.html b/branch-4.2/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..733813462 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries use Consistency Level: ALL

                        +

                        Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                        +

                        Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                        +

                        Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlCLAny.html b/branch-4.2/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..acb99855c --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries use Consistency Level: ANY

                        +

                        Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                        +

                        Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.2/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..456d047f2 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries are not token-aware

                        +

                        Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                        +

                        Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlNonPaged.html b/branch-4.2/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..f670b5c81 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some SELECT queries are non-paged

                        +

                        By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                        +
                        +

                        Blog-post Links

                        +

                        https://www.scylladb.com/2018/07/13/efficient-query-paging/

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.2/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..964c9f577 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries are non-prepared

                        +

                        Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.2/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..baa652c2f --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Some queries use reverse order

                        +

                        Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                        +

                        Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/heavyCompaction.html b/branch-4.2/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..f8143f062 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Compaction takes lots of memory and CPU

                        +

                        ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                        +

                        If this is the case, you can do one of the following:

                        +
                          +
                        • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                          +
                          +
                            +
                          • In the scylla.yml configuration file: compaction_static_shares: 100

                          • +
                          • In the command line when starting ScyllaDB: --compaction-static-shares 100

                          • +
                          +
                          +

                          You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                          +
                        • +
                        • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                        • +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/index.html b/branch-4.2/use-monitoring/advisor/index.html new file mode 100644 index 000000000..4f29c0097 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/index.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Scylla Monitoring Stack Advisor

                        +
                        +
                        +

                        The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                        +
                        +

                        The Advisor section

                        +
                        +../../_images/advisor_panel.png +
                        +

                        The Advisor section

                        +
                        +
                        +

                        The Advisor section is located on the Overview dashboard and consists of two parts:

                        +

                        On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                        +

                        For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                        +

                        On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                        +

                        For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                        +

                        Each Advisor issue is explained in detail:

                        + +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/nodeCLErrors.html b/branch-4.2/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..370733c59 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Some operation failed due to unsatisfied consistency level

                        +

                        ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                        +

                        For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                        +

                        When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/nodeIOErrors.html b/branch-4.2/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..a86620f29 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        I/O Errors can indicate a node with a faulty disk

                        +

                        I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.2/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..832855323 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Some operations failed on the replica side

                        +

                        ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                        +

                        An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.2/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..a24d3ce10 --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        CQL queries are not balanced among shards

                        +

                        For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                        +

                        There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                        +
                        +

                        Blog post link

                        +

                        https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.2/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..13543a53a --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        Prepared statements cache eviction

                        +

                        Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                        +
                          +
                        • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                        • +
                        • The prepared statements cache might be too small for the number of prepared statements.

                        • +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/advisor/systemOverload.html b/branch-4.2/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..264991e3b --- /dev/null +++ b/branch-4.2/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        System Overload

                        +

                        There could be multiple indications that a system is overloaded:

                        +
                          +
                        • Timeouts

                        • +
                        • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                        • +
                        • CPU at 100% when no background process (like compaction or repair) runs.

                        • +
                        • Ques are getting filled.

                        • +
                        +

                        If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/cql_optimization.html b/branch-4.2/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..47256d971 --- /dev/null +++ b/branch-4.2/use-monitoring/cql_optimization.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + + + +
                        +

                        The CQL Optimization

                        +

                        The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                        +
                        +../_images/cql_optimization_master.png +
                        +

                        The CQL Dashboard

                        +
                        +
                        +

                        The upper part of the dashboard holds CQL related metrics.

                        +

                        The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                        +
                        +

                        Note

                        +

                        Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                        +
                        +

                        The following sections describe each of the dashboard’s panel

                        +
                        +

                        Prepared Statements

                        +

                        Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                        +

                        Using prepared statements has the following benefits:

                        +
                          +
                        • The database only needs to parse the query once

                        • +
                        • The driver can route the query to the right node

                        • +
                        • Using place-holders and values is safer and prevents CQL-Injection

                        • +
                        +

                        The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                        +

                        The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                        +
                        +
                        +

                        Token Aware

                        +

                        Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                        +

                        Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                        +

                        The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                        +

                        The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                        +
                        +
                        +

                        Paged Queries

                        +

                        By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                        +

                        The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                        +

                        The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                        +
                        +
                        +

                        Reversed CQL Reads

                        +

                        Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                        +

                        Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                        +

                        For example, look at the following table:

                        +
                        CREATE TABLE ks1.table_demo (
                        +   category text,
                        +   type int,
                        +   PRIMARY KEY (category, type))
                        +WITH CLUSTERING ORDER BY (type DESC);
                        +
                        +
                        +

                        The following query uses reverse order:

                        +
                        select * from ks1.table_demo where category='cat1' order by type ASC;
                        +
                        +
                        +

                        The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                        +

                        The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                        +
                        +
                        +

                        ALLOW FILTERING

                        +

                        Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                        +

                        These kinds of queries can create a big load on the system, and should be used with care.

                        +

                        The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                        +

                        The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                        +

                        The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                        +

                        The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                        +

                        The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                        +
                        +
                        +

                        Consistency Level

                        +

                        Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                        +

                        The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                        +

                        Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                        +

                        The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                        +

                        The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                        +

                        The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                        +

                        The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                        +
                        +
                        +

                        Cross DC

                        +

                        Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                        +
                        +
                        +

                        Cross DC Consistency Level

                        +

                        Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                        +
                        +
                        +

                        Cross DC read requests

                        +
                        +

                        Note

                        +

                        The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                        +
                        +

                        In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                        +

                        The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                        +
                        +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.2/use-monitoring/index.html b/branch-4.2/use-monitoring/index.html new file mode 100644 index 000000000..82979cb67 --- /dev/null +++ b/branch-4.2/use-monitoring/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +
                        +

                        Using Scylla Monitoring Stack

                        +
                        +
                        +

                        There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                        + +
                        + + +
                        + + + + + + + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.3/.buildinfo b/branch-4.3/.buildinfo new file mode 100644 index 000000000..07cf06632 --- /dev/null +++ b/branch-4.3/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 42df671fa3bd52bdb87fc75013663629 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.3/.doctrees/_common/monitor-description.doctree b/branch-4.3/.doctrees/_common/monitor-description.doctree new file mode 100644 index 000000000..074659eb7 Binary files /dev/null and b/branch-4.3/.doctrees/_common/monitor-description.doctree differ diff --git a/branch-4.3/.doctrees/environment.pickle b/branch-4.3/.doctrees/environment.pickle new file mode 100644 index 000000000..a693c01cf Binary files /dev/null and b/branch-4.3/.doctrees/environment.pickle differ diff --git a/branch-4.3/.doctrees/index.doctree b/branch-4.3/.doctrees/index.doctree new file mode 100644 index 000000000..d3ddff858 Binary files /dev/null and b/branch-4.3/.doctrees/index.doctree differ diff --git a/branch-4.3/.doctrees/install/docker_compose.doctree b/branch-4.3/.doctrees/install/docker_compose.doctree new file mode 100644 index 000000000..4d12d724b Binary files /dev/null and b/branch-4.3/.doctrees/install/docker_compose.doctree differ diff --git a/branch-4.3/.doctrees/install/index.doctree b/branch-4.3/.doctrees/install/index.doctree new file mode 100644 index 000000000..154954ded Binary files /dev/null and b/branch-4.3/.doctrees/install/index.doctree differ diff --git a/branch-4.3/.doctrees/install/min-prod-hw.doctree b/branch-4.3/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..05bee3c34 Binary files /dev/null and b/branch-4.3/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.3/.doctrees/install/monitor_without_docker.doctree b/branch-4.3/.doctrees/install/monitor_without_docker.doctree new file mode 100644 index 000000000..981fabde5 Binary files /dev/null and b/branch-4.3/.doctrees/install/monitor_without_docker.doctree differ diff --git a/branch-4.3/.doctrees/install/monitoring_stack.doctree b/branch-4.3/.doctrees/install/monitoring_stack.doctree new file mode 100644 index 000000000..afacea193 Binary files /dev/null and b/branch-4.3/.doctrees/install/monitoring_stack.doctree differ diff --git a/branch-4.3/.doctrees/install/start_all.doctree b/branch-4.3/.doctrees/install/start_all.doctree new file mode 100644 index 000000000..0c61d904b Binary files /dev/null and b/branch-4.3/.doctrees/install/start_all.doctree differ diff --git a/branch-4.3/.doctrees/install/thanos.doctree b/branch-4.3/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..30f133a6d Binary files /dev/null and b/branch-4.3/.doctrees/install/thanos.doctree differ diff --git a/branch-4.3/.doctrees/intro.doctree b/branch-4.3/.doctrees/intro.doctree new file mode 100644 index 000000000..954423f23 Binary files /dev/null and b/branch-4.3/.doctrees/intro.doctree differ diff --git a/branch-4.3/.doctrees/procedures/alerts/alerting.doctree b/branch-4.3/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..324cf0e36 Binary files /dev/null and b/branch-4.3/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.3/.doctrees/procedures/alerts/index.doctree b/branch-4.3/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..dbacef66f Binary files /dev/null and b/branch-4.3/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.3/.doctrees/procedures/datadog/index.doctree b/branch-4.3/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..7da5e9cc8 Binary files /dev/null and b/branch-4.3/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.3/.doctrees/procedures/index.doctree b/branch-4.3/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..e2bc452cc Binary files /dev/null and b/branch-4.3/.doctrees/procedures/index.doctree differ diff --git a/branch-4.3/.doctrees/procedures/updating_dashboard.doctree b/branch-4.3/.doctrees/procedures/updating_dashboard.doctree new file mode 100644 index 000000000..fd6d4c1a3 Binary files /dev/null and b/branch-4.3/.doctrees/procedures/updating_dashboard.doctree differ diff --git a/branch-4.3/.doctrees/reference/index.doctree b/branch-4.3/.doctrees/reference/index.doctree new file mode 100644 index 000000000..3bbd0924c Binary files /dev/null and b/branch-4.3/.doctrees/reference/index.doctree differ diff --git a/branch-4.3/.doctrees/reference/matrix.doctree b/branch-4.3/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..6d55c4e37 Binary files /dev/null and b/branch-4.3/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.3/.doctrees/reference/monitoring_apis.doctree b/branch-4.3/.doctrees/reference/monitoring_apis.doctree new file mode 100644 index 000000000..227134142 Binary files /dev/null and b/branch-4.3/.doctrees/reference/monitoring_apis.doctree differ diff --git a/branch-4.3/.doctrees/troubleshooting/index.doctree b/branch-4.3/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..acab0dc12 Binary files /dev/null and b/branch-4.3/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.3/.doctrees/troubleshooting/monitor_troubleshoot.doctree b/branch-4.3/.doctrees/troubleshooting/monitor_troubleshoot.doctree new file mode 100644 index 000000000..ed68a40a6 Binary files /dev/null and b/branch-4.3/.doctrees/troubleshooting/monitor_troubleshoot.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/index.doctree b/branch-4.3/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..e49cc469d Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..947c09acd Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..461743b66 Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..d87a74d7e Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..4d8c527bc Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..4ec9c826e Binary files /dev/null and b/branch-4.3/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..72faf073e Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..0d2c930ce Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..4921228e8 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..f780e4509 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..3b3491479 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..722e6b5f8 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..e3df2e784 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..a676c8683 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..f77ea634d Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..e9978f2db Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..c7f6ca231 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..3d2338756 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..661d2034d Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..fc3d5a01a Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.3/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..8b770ddd7 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/cql_optimization.doctree b/branch-4.3/.doctrees/use-monitoring/cql_optimization.doctree new file mode 100644 index 000000000..69cb063e0 Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/cql_optimization.doctree differ diff --git a/branch-4.3/.doctrees/use-monitoring/index.doctree b/branch-4.3/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..13ad9092b Binary files /dev/null and b/branch-4.3/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.3/.nojekyll b/branch-4.3/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.3/404.html b/branch-4.3/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.3/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                        +

                        404

                        +

                        The ScyllaDB monster ate your page!

                        +

                        + Home +

                        +
                        + + + \ No newline at end of file diff --git a/branch-4.3/CNAME b/branch-4.3/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.3/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.3/_common/monitor-description.html b/branch-4.3/_common/monitor-description.html new file mode 100644 index 000000000..e3d6d9197 --- /dev/null +++ b/branch-4.3/_common/monitor-description.html @@ -0,0 +1,646 @@ + + + + + + + + + + + + + <no title> | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        + + + +
                        +
                        + Menu +
                        +
                        +
                        +
                        +
                        + + +
                        +

                        Caution

                        +

                        + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                        +
                        + + + +
                        + +
                        + +

                        ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                        + + +
                        + + + + + +
                        + + +
                        + +
                        + +
                        + + + + +
                        + + + + + + + \ No newline at end of file diff --git a/branch-4.3/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.3/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/branch-4.3/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/branch-4.3/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.3/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.3/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.3/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.3/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/branch-4.3/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.3/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.3/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/branch-4.3/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.3/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.3/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/branch-4.3/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.3/_images/1.png b/branch-4.3/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.3/_images/1.png differ diff --git a/branch-4.3/_images/2.png b/branch-4.3/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.3/_images/2.png differ diff --git a/branch-4.3/_images/3.png b/branch-4.3/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.3/_images/3.png differ diff --git a/branch-4.3/_images/advisor_panel.png b/branch-4.3/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.3/_images/advisor_panel.png differ diff --git a/branch-4.3/_images/after-backfilling.jpg b/branch-4.3/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.3/_images/after-backfilling.jpg differ diff --git a/branch-4.3/_images/alertmanager.png b/branch-4.3/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.3/_images/alertmanager.png differ diff --git a/branch-4.3/_images/before-backfilling.png b/branch-4.3/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.3/_images/before-backfilling.png differ diff --git a/branch-4.3/_images/cql_optimization_master.png b/branch-4.3/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.3/_images/cql_optimization_master.png differ diff --git a/branch-4.3/_images/datadog.png b/branch-4.3/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.3/_images/datadog.png differ diff --git a/branch-4.3/_images/grafana.png b/branch-4.3/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.3/_images/grafana.png differ diff --git a/branch-4.3/_images/monitor.png b/branch-4.3/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.3/_images/monitor.png differ diff --git a/branch-4.3/_images/monitoring_stack.png b/branch-4.3/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.3/_images/monitoring_stack.png differ diff --git a/branch-4.3/_images/monitoring_stack1.png b/branch-4.3/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.3/_images/monitoring_stack1.png differ diff --git a/branch-4.3/_sources/_common/monitor-description.rst.txt b/branch-4.3/_sources/_common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.3/_sources/_common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.3/_sources/index.rst.txt b/branch-4.3/_sources/index.rst.txt new file mode 100644 index 000000000..97ea5ff5a --- /dev/null +++ b/branch-4.3/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on Scylla University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.3/_sources/install/docker_compose.rst.txt b/branch-4.3/_sources/install/docker_compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.3/_sources/install/docker_compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.3/_sources/install/index.rst.txt b/branch-4.3/_sources/install/index.rst.txt new file mode 100644 index 000000000..586c4d92f --- /dev/null +++ b/branch-4.3/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.3/_sources/install/min-prod-hw.rst.txt b/branch-4.3/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.3/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                        + + + + + + + + + + + +
                        # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                        00
                        + +
                        + \ No newline at end of file diff --git a/branch-4.3/_sources/install/monitor_without_docker.rst.txt b/branch-4.3/_sources/install/monitor_without_docker.rst.txt new file mode 100644 index 000000000..d0be59164 --- /dev/null +++ b/branch-4.3/_sources/install/monitor_without_docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                        `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.3/_sources/install/monitoring_stack.rst.txt b/branch-4.3/_sources/install/monitoring_stack.rst.txt new file mode 100644 index 000000000..b43ff5b1f --- /dev/null +++ b/branch-4.3/_sources/install/monitoring_stack.rst.txt @@ -0,0 +1,403 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on `Scylla Prometheus API <../../reference/monitoring_apis/#prometheus>`_ + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                        `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.3/_sources/install/start_all.rst.txt b/branch-4.3/_sources/install/start_all.rst.txt new file mode 100644 index 000000000..3d5aadc8b --- /dev/null +++ b/branch-4.3/_sources/install/start_all.rst.txt @@ -0,0 +1,102 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.3/_sources/install/thanos.rst.txt b/branch-4.3/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.3/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.3/_sources/intro.rst.txt b/branch-4.3/_sources/intro.rst.txt new file mode 100644 index 000000000..67e73435b --- /dev/null +++ b/branch-4.3/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /_common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.3/_sources/procedures/alerts/alerting.rst.txt b/branch-4.3/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.3/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.3/_sources/procedures/alerts/index.rst.txt b/branch-4.3/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.3/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.3/_sources/procedures/datadog/index.rst.txt b/branch-4.3/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..c36878a27 --- /dev/null +++ b/branch-4.3/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,65 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the promemtheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non cloud users, download the rules configuration file :download:`datadog.rules.yml ` and place it under prometheus/prom_rules/. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.3/_sources/procedures/index.rst.txt b/branch-4.3/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..9e17f2aa1 --- /dev/null +++ b/branch-4.3/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.3/_sources/procedures/updating_dashboard.rst.txt b/branch-4.3/_sources/procedures/updating_dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.3/_sources/procedures/updating_dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.3/_sources/reference/index.rst.txt b/branch-4.3/_sources/reference/index.rst.txt new file mode 100644 index 000000000..0aa043184 --- /dev/null +++ b/branch-4.3/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.3/_sources/reference/matrix.rst.txt b/branch-4.3/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..5e3a70d72 --- /dev/null +++ b/branch-4.3/_sources/reference/matrix.rst.txt @@ -0,0 +1,140 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.3/_sources/reference/monitoring_apis.rst.txt b/branch-4.3/_sources/reference/monitoring_apis.rst.txt new file mode 100644 index 000000000..ce53e9d8f --- /dev/null +++ b/branch-4.3/_sources/reference/monitoring_apis.rst.txt @@ -0,0 +1,25 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +Prometheus +---------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring_stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.3/_sources/troubleshooting/index.rst.txt b/branch-4.3/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..ea0d9955d --- /dev/null +++ b/branch-4.3/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.3/_sources/troubleshooting/monitor_troubleshoot.rst.txt b/branch-4.3/_sources/troubleshooting/monitor_troubleshoot.rst.txt new file mode 100644 index 000000000..3026df586 --- /dev/null +++ b/branch-4.3/_sources/troubleshooting/monitor_troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring_apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring_stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring_stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor_without_docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.3/_sources/upgrade/index.rst.txt b/branch-4.3/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..817f65247 --- /dev/null +++ b/branch-4.3/_sources/upgrade/index.rst.txt @@ -0,0 +1,42 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                        +
                        +
                        +
                        Upgrade Scylla Open Source
                        +
                        +
                        + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                        +
                        +
                        diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..0e4fd3baa --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,103 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 1.x to 2.x + + + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..3bb8af42b --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,132 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..d1974adfc --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,63 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading |mon_root| from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* |mon_root| +* :doc:`Upgrade` diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..a356f5c21 --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,138 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..b64fd5d7e --- /dev/null +++ b/branch-4.3/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,281 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading `Scylla Monitoring Stack `_ from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* `Scylla Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.3/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.3/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.3/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.3/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.3/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.3/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.3/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.3/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.3/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.3/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.3/_sources/use-monitoring/cql_optimization.rst.txt b/branch-4.3/_sources/use-monitoring/cql_optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/cql_optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.3/_sources/use-monitoring/index.rst.txt b/branch-4.3/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..f73e13bb2 --- /dev/null +++ b/branch-4.3/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.3/_static/basic.css b/branch-4.3/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.3/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.3/_static/check-solid.svg b/branch-4.3/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.3/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.3/_static/clipboard.min.js b/branch-4.3/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.3/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.3/_static/copybutton.css b/branch-4.3/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.3/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                        Short

                        + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.3/_static/copybutton.js b/branch-4.3/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.3/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.3/_static/copybutton_funcs.js b/branch-4.3/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.3/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.3/_static/css/main.css b/branch-4.3/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-4.3/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.3/_static/doctools.js b/branch-4.3/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.3/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.3/_static/documentation_options.js b/branch-4.3/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.3/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.3/_static/file.png b/branch-4.3/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.3/_static/file.png differ diff --git a/branch-4.3/_static/img/banner-background.svg b/branch-4.3/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.3/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.3/_static/img/favicon-228x228.png b/branch-4.3/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.3/_static/img/favicon-228x228.png differ diff --git a/branch-4.3/_static/img/favicon-32x32.png b/branch-4.3/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.3/_static/img/favicon-32x32.png differ diff --git a/branch-4.3/_static/img/favicon.ico b/branch-4.3/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.3/_static/img/favicon.ico differ diff --git a/branch-4.3/_static/img/icons/icon-about-team.svg b/branch-4.3/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.3/_static/img/icons/icon-about-us-m.svg b/branch-4.3/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-about-us.svg b/branch-4.3/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-alternator.svg b/branch-4.3/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-apps.svg b/branch-4.3/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-architecture.svg b/branch-4.3/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.3/_static/img/icons/icon-benchmarks.svg b/branch-4.3/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.3/_static/img/icons/icon-blog.svg b/branch-4.3/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.3/_static/img/icons/icon-careers.svg b/branch-4.3/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.3/_static/img/icons/icon-chevron-left.svg b/branch-4.3/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.3/_static/img/icons/icon-chevron-right.svg b/branch-4.3/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.3/_static/img/icons/icon-circe.svg b/branch-4.3/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-clock.svg b/branch-4.3/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-close.svg b/branch-4.3/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-cloud-docs.svg b/branch-4.3/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-cloud.svg b/branch-4.3/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-comparison.svg b/branch-4.3/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.3/_static/img/icons/icon-contact-us.svg b/branch-4.3/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.3/_static/img/icons/icon-developers-blog.svg b/branch-4.3/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.3/_static/img/icons/icon-docs.svg b/branch-4.3/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.3/_static/img/icons/icon-enterprise-m.svg b/branch-4.3/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-enterprise.svg b/branch-4.3/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-events.svg b/branch-4.3/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.3/_static/img/icons/icon-exclamation.svg b/branch-4.3/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-expand.svg b/branch-4.3/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-forum.svg b/branch-4.3/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-getting-started.svg b/branch-4.3/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-glossary.svg b/branch-4.3/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-home.svg b/branch-4.3/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-infoworld.svg b/branch-4.3/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.3/_static/img/icons/icon-integrations.svg b/branch-4.3/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-knowledge-base.svg b/branch-4.3/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-less.svg b/branch-4.3/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-live-test.svg b/branch-4.3/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.3/_static/img/icons/icon-mail-list.svg b/branch-4.3/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-manager.svg b/branch-4.3/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.3/_static/img/icons/icon-memory-management.svg b/branch-4.3/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.3/_static/img/icons/icon-modeling.svg b/branch-4.3/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-monitoring.svg b/branch-4.3/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.3/_static/img/icons/icon-networking.svg b/branch-4.3/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.3/_static/img/icons/icon-news.svg b/branch-4.3/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.3/_static/img/icons/icon-newsletter.svg b/branch-4.3/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.3/_static/img/icons/icon-nsql-guides.svg b/branch-4.3/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.3/_static/img/icons/icon-open-source.svg b/branch-4.3/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.3/_static/img/icons/icon-operator.svg b/branch-4.3/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-overview.svg b/branch-4.3/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.3/_static/img/icons/icon-partners.svg b/branch-4.3/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.3/_static/img/icons/icon-plus.svg b/branch-4.3/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-pricing.svg b/branch-4.3/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.3/_static/img/icons/icon-release-notes.svg b/branch-4.3/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.3/_static/img/icons/icon-resource-center.svg b/branch-4.3/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.3/_static/img/icons/icon-roadmap.svg b/branch-4.3/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.3/_static/img/icons/icon-search.svg b/branch-4.3/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.3/_static/img/icons/icon-slack.svg b/branch-4.3/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-stack-overflow.svg b/branch-4.3/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.3/_static/img/icons/icon-summit.svg b/branch-4.3/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/icons/icon-support.svg b/branch-4.3/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.3/_static/img/icons/icon-tech-talks.svg b/branch-4.3/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.3/_static/img/icons/icon-testing.svg b/branch-4.3/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.3/_static/img/icons/icon-thumbs-down.svg b/branch-4.3/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-thumbs-up.svg b/branch-4.3/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.3/_static/img/icons/icon-tip.svg b/branch-4.3/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.3/_static/img/icons/icon-training.svg b/branch-4.3/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.3/_static/img/icons/icon-triangle-down.svg b/branch-4.3/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.3/_static/img/icons/icon-university.svg b/branch-4.3/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.3/_static/img/icons/icon-users-blog.svg b/branch-4.3/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.3/_static/img/icons/icon-warning.svg b/branch-4.3/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.3/_static/img/icons/icon-webinars.svg b/branch-4.3/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.3/_static/img/icons/icon-whitepapers.svg b/branch-4.3/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.3/_static/img/icons/icon-workshop.svg b/branch-4.3/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.3/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.3/_static/img/logo-docs.svg b/branch-4.3/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.3/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.3/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.3/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.3/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.3/_static/img/mascots/404.jpg b/branch-4.3/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.3/_static/img/mascots/404.jpg differ diff --git a/branch-4.3/_static/img/mascots/scylla-3monsters.png b/branch-4.3/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.3/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-alternator.svg b/branch-4.3/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.3/_static/img/mascots/scylla-cloud.svg b/branch-4.3/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.3/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.3/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-computer-headset.png b/branch-4.3/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-cup-number-one.png b/branch-4.3/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-docs.svg b/branch-4.3/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.3/_static/img/mascots/scylla-drivers.svg b/branch-4.3/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.3/_static/img/mascots/scylla-enterprise.svg b/branch-4.3/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.3/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.3/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-forklift-migration.png b/branch-4.3/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-gear.png b/branch-4.3/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-hardhat.png b/branch-4.3/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-headband.png b/branch-4.3/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-headset.png b/branch-4.3/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-hearts.png b/branch-4.3/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-looking-down.png b/branch-4.3/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-looking-up.png b/branch-4.3/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.3/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.3/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-manager.svg b/branch-4.3/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.3/_static/img/mascots/scylla-monitor.svg b/branch-4.3/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.3/_static/img/mascots/scylla-movement-fast.png b/branch-4.3/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-movement.png b/branch-4.3/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-onpremise.png b/branch-4.3/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-opensource.svg b/branch-4.3/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.3/_static/img/mascots/scylla-operator.svg b/branch-4.3/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.3/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.3/_static/img/mascots/scylla-plugin.png b/branch-4.3/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-release-mascot.png b/branch-4.3/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-repair.png b/branch-4.3/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-server.png b/branch-4.3/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-sleeping.png b/branch-4.3/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-tall-measure.png b/branch-4.3/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-university.png b/branch-4.3/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-weights.png b/branch-4.3/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-window-cleaning.png b/branch-4.3/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-with-computer-2.png b/branch-4.3/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-with-computer.png b/branch-4.3/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-with-linux.png b/branch-4.3/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.3/_static/img/mascots/scylla-writting.png b/branch-4.3/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.3/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.3/_static/img/menu.svg b/branch-4.3/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.3/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.3/_static/img/scylla-monitor.png b/branch-4.3/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.3/_static/img/scylla-monitor.png differ diff --git a/branch-4.3/_static/js/main.bundle.js b/branch-4.3/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-4.3/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                      • Back
                      • ',backButtonPosition:"top",wrapper:"
                        ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                          "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                          ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                          ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                          ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                          ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                          "],col:[2,"","
                          "],tr:[2,"","
                          "],td:[3,"","
                          "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + + + +
                          + + + + + +
                          + + +
                          + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/index.html b/branch-4.3/index.html new file mode 100644 index 000000000..90ef0def9 --- /dev/null +++ b/branch-4.3/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          ScyllaDB Monitoring Stack

                          +
                          +
                          +

                          ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                          +_images/monitor.png +

                          The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                          +
                            +
                          • prometheus - collects and stores metrics

                          • +
                          • alertmanager - handles alerts

                          • +
                          • grafana - dashboard server

                          • +
                          +

                          Choose a topic to get started:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/docker_compose.html b/branch-4.3/install/docker_compose.html new file mode 100644 index 000000000..851439480 --- /dev/null +++ b/branch-4.3/install/docker_compose.html @@ -0,0 +1,810 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Using Docker Compose

                          +

                          Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                          +

                          Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                          +
                          +

                          Warning

                          +

                          docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                          +
                          +
                          +

                          Prerequisite

                          +

                          Make sure you have docker and docker-compose installed.

                          +
                          +
                          +

                          Setting Prometheus

                          +

                          The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                          +

                          You can use ./prometheus-config.sh to generate the file, for example:

                          +
                          ./prometheus-config.sh --compose
                          +
                          +
                          +

                          For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                          +
                          +
                          +

                          Setting Grafana Provisioning

                          +

                          Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                          +
                          +

                          Grafana Data-Source file

                          +

                          Run the following command to update the datasource:

                          +
                          ./grafana-datasource.sh --compose
                          +
                          +
                          +

                          You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                          +
                          +
                          +

                          Grafana Dashboard Load file

                          +

                          To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                          +
                          ./generate-dashboards.sh -t -v 2020.1
                          +
                          +
                          +

                          This command generates the files under: grafana/provisioning/dashboards/

                          +
                          +
                          +
                          +

                          Docker Compose file

                          +

                          You can use the following example as a base for your docker compose.

                          +

                          Pass the following to a file called docker-compose.yml

                          +
                          services:
                          +  alertmanager:
                          +    container_name: aalert
                          +    image: prom/alertmanager:v0.21.0
                          +    ports:
                          +    - 9093:9093
                          +    volumes:
                          +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                          +  grafana:
                          +    container_name: agraf
                          +    environment:
                          +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                          +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                          +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                          +    # This is where you set Grafana security
                          +    - GF_AUTH_BASIC_ENABLED=false
                          +    - GF_AUTH_ANONYMOUS_ENABLED=true
                          +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                          +    - GF_SECURITY_ADMIN_PASSWORD=admin
                          +    image: grafana/grafana:7.3.5
                          +    ports:
                          +    - 3000:3000
                          +    user: 1000:1000
                          +    volumes:
                          +    - ./grafana/build:/var/lib/grafana/dashboards
                          +    - ./grafana/plugins:/var/lib/grafana/plugins
                          +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                          +    # Uncomment the following line for grafana persistency
                          +    # - path/to/grafana/dir:/var/lib/grafana
                          +  loki:
                          +    command:
                          +    - --config.file=/mnt/config/loki-config.yaml
                          +    container_name: loki
                          +    image: grafana/loki:2.0.0
                          +    ports:
                          +    - 3100:3100
                          +    volumes:
                          +    - ./loki/rules:/etc/loki/rules
                          +    - ./loki/conf:/mnt/config
                          +  promotheus:
                          +    command:
                          +    - --config.file=/etc/prometheus/prometheus.compose.yml
                          +    container_name: aprom
                          +    image: prom/prometheus:v2.18.1
                          +    ports:
                          +    - 9090:9090
                          +    volumes:
                          +    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
                          +    - ./prometheus/prometheus.rules.yml:/etc/prometheus/prometheus.rules.yml
                          +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                          +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                          +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                          +    # Uncomment the following line for prometheus persistency 
                          +    # - path/to/data/dir:/prometheus/data
                          +  promtail:
                          +    command:
                          +    - --config.file=/etc/promtail/config.yml
                          +    container_name: promtail
                          +    image: grafana/promtail:2.0.0
                          +    ports:
                          +    - 1514:1514
                          +    - 9080:9080
                          +    volumes:
                          +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                          +version: '3'
                          +
                          +
                          +
                          +

                          Start and Stop

                          +

                          To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/index.html b/branch-4.3/install/index.html new file mode 100644 index 000000000..8cc95b55c --- /dev/null +++ b/branch-4.3/install/index.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Download and Install Scylla Monitoring Stack

                          +
                          +
                          +

                          Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                          +

                          Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/min-prod-hw.html b/branch-4.3/install/min-prod-hw.html new file mode 100644 index 000000000..48cfee5ad --- /dev/null +++ b/branch-4.3/install/min-prod-hw.html @@ -0,0 +1,739 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Minimal Production System Recommendations

                          +
                            +
                          • CPU - at least 2 physical cores/ 4vCPUs

                          • +
                          • Memory - 15GB+ DRAM and proportional to the number of cores.

                          • +
                          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                          • +
                          • Network - 1GbE/10GbE preferred

                          • +
                          +
                          +

                          Calculating Prometheus Minimal Disk Space requirement

                          +

                          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                          +

                          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                          +

                          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                          +
                          6 * 16 * 15 * 12MB ~ 16GB
                          +
                          +
                          +

                          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                          +
                          +
                          +

                          Calculating Prometheus Minimal Memory Space requirement

                          +

                          Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                          +

                          For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                          + +
                          + +++++++ + + + +
                          # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                          00
                          + +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/monitor_without_docker.html b/branch-4.3/install/monitor_without_docker.html new file mode 100644 index 000000000..4ed4efdb4 --- /dev/null +++ b/branch-4.3/install/monitor_without_docker.html @@ -0,0 +1,1155 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Deploying Scylla Monitoring Stack Without Docker

                          +
                          +

                          Introduction

                          +

                          The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                          +

                          Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                          +

                          Scylla Monitoring uses the following components:

                          +
                            +
                          • Alertmanager

                          • +
                          • Grafana Loki

                          • +
                          • Prometheus

                          • +
                          • Grafana

                          • +
                          +

                          The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                          +

                          We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                          +
                          +
                          +

                          Minimal Production System Recommendations

                          +
                            +
                          • CPU - at least 2 physical cores/ 4vCPUs

                          • +
                          • Memory - 15GB+ DRAM and proportional to the number of cores.

                          • +
                          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                          • +
                          • Network - 1GbE/10GbE preferred

                          • +
                          +
                          +

                          Calculating Prometheus Minimal Disk Space requirement

                          +

                          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                          +

                          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                          +

                          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                          +
                          6 * 16 * 15 * 12MB ~ 16GB
                          +
                          +
                          +

                          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                          +
                          +
                          +

                          Calculating Prometheus Minimal Memory Space requirement

                          +

                          Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                          +

                          For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                          + +
                          + +++++++ + + + +
                          # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                          00
                          + +
                          +

                          The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                          +
                          +

                          Note

                          +

                          Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                          +
                          +
                          +
                          +
                          +

                          Install Scylla Monitoring Stack

                          +

                          The following procedure uses a CentOS 7 based instance

                          +
                            +
                          1. Download the latest Scylla Monitoring Stack release.

                          2. +
                          +
                          wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.3.4.tar.gz
                          +
                          +
                          +
                            +
                          1. Open the tar

                          2. +
                          +

                          tar -xvf scylla-monitoring-*.tar.gz

                          +
                          +
                          +

                          Install Alertmanager

                          +

                          Tested with alertmanager 0.22.2 version

                          +
                            +
                          1. Install alertmanager

                          2. +
                          +
                          wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                          +tar -xvf alertmanager-*.linux-amd64.tar.gz
                          +
                          +
                          +
                            +
                          1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                          2. +
                          +

                          For example:

                          +
                          cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.3.4/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                          +
                          +
                          +
                            +
                          1. Start the Alertmanager

                          2. +
                          +

                          For example:

                          +
                          cd alertmanager-0.22.2.linux-amd64
                          +./alertmanager
                          +
                          +
                          +
                            +
                          1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                          2. +
                          +

                          For example:

                          +
                          http://192.168.135.166:9093/
                          +
                          +
                          +../_images/alertmanager.png +
                          +
                          +

                          Install Grafana Loki

                          +

                          Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                          +

                          We recomand using Loki with containers, but you can install it locally as described in Loki installation

                          +

                          You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                          +

                          Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                          +

                          Loki Related files

                          +

                          Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                          +
                          mkdir -p /etc/loki/rules
                          +mkdir -p /etc/loki/config
                          +cp loki/rules/* /etc/loki/rules
                          +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                          +
                          +
                          +

                          Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                          +

                          Promtail Related files

                          +

                          Promtail has a configuration file. You need to copy and modify the configuration.

                          +
                          mkdir -p /etc/promtail/
                          +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                          +
                          +
                          +

                          Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                          +
                          +
                          +

                          Install Prometheus

                          +

                          Tested with Prometheus version 2.27.1

                          +
                          +

                          Note

                          +

                          If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                          +
                          +
                            +
                          1. Install Prometheus

                          2. +
                          +
                          wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                          +tar -xvf prometheus-*.linux-amd64.tar.gz
                          +
                          +
                          +

                          2. Create Data and Config directories +.. code-block:: shell

                          +
                          +

                          mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                          +
                          +
                            +
                          1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                          2. +
                          +

                          Copy prometheus/prometheus.yml.template to prometheus.yml

                          +

                          For example:

                          +
                          cp scylla-monitoring-scylla-monitoring-4.3.4/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                          +cp scylla-monitoring-scylla-monitoring-4.3.4/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                          +
                          +
                          +
                            +
                          1. Edit the prometheus.yml file to point to the correct static data sources.

                          2. +
                          +
                          +

                          Note

                          +

                          Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                          +
                          +
                          vi /etc/prometheus/prometheus.yml
                          +
                          +
                          +

                          Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                          +

                          For example if the alertmanager will run on the same host:

                          +
                          alerting:
                          +   alertmanagers:
                          +   - static_configs:
                          +       - targets:
                          +           - 127.0.0.1:9093
                          +
                          +
                          +

                          Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                          +

                          For example the scrape config for Scylla:

                          +
                          global:
                          +  scrape_interval: 5s # By default, scrape targets every 5 second.
                          +  scrape_timeout: 4s # Timeout before trying to scape a target again
                          +
                          +  # Attach these labels to any time series or alerts when communicating with
                          +  # external systems (federation, remote storage, Alertmanager).
                          +  external_labels:
                          +    monitor: 'scylla-monitor'
                          +
                          +scrape_configs:
                          +- job_name: scylla
                          +  honor_labels: false
                          +  file_sd_configs:
                          +    - files:
                          +      - /etc/scylla.d/prometheus/scylla_servers.yml
                          +  relabel_configs:
                          +    - source_labels: [__address__]
                          +      regex:  '([^:]+)'
                          +      target_label: __address__
                          +      replacement: '${1}:9180'
                          +
                          +    - source_labels: [__address__]
                          +      regex:  '(.*):.+'
                          +      target_label: instance
                          +      replacement: '${1}'
                          +
                          +
                          +
                            +
                          1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                          2. +
                          +
                          +

                          Note

                          +

                          There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                          +
                          +

                          An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                          +
                          +

                          Note

                          +

                          You must have both files even if you are not using Scylla Manager

                          +
                          +

                          Add the labels for the cluster and data-center

                          +

                          scylla_servers.yml:

                          +

                          For example:

                          +
                          cat scylla_servers.yml
                          +# List Scylla end points
                          +
                          +- targets:
                          +  - 192.168.66.6
                          +  - 192.168.66.244
                          +  labels:
                          +    cluster: cluster1
                          +    dc: dc1
                          +- targets:
                          +    - 172.17.0.3
                          +  labels:
                          +    cluster: cluster1
                          +    dc: dc2
                          +
                          +
                          +
                          +

                          Note

                          +

                          See the previous note about deprecating the node_exporter_servers.yml file.

                          +
                          +

                          scylla_manager_server.yml

                          +

                          For example:

                          +
                          - targets:
                          +  - 127.0.0.1:5090
                          +
                          +
                          +
                            +
                          1. Start Prometheus server:

                          2. +
                          +

                          For example:

                          +
                          cd scylla-monitoring-scylla-monitoring-4.3.4/
                          +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                          +
                          +
                          +

                          Data should start accumulate on: /prometheus/data

                          +
                            +
                          1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                          2. +
                          +

                          For example:

                          +
                          http://192.168.135.166:9090/
                          +
                          +
                          +../_images/1.png +

                          Prometheus console should be visible

                          +
                            +
                          1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                          2. +
                          +

                          For example:

                          +

                          node_memory_MemFree

                          +../_images/2.png +

                          And

                          +

                          scylla_reactor_utilization

                          +../_images/3.png +

                          At this point Scylla is emitting the metrics and Prometheus is able to store them.

                          +
                          +
                          +

                          Install Grafana

                          +

                          Tested with Grafna 7.5.7

                          +
                            +
                          1. Install Grafana based on the instructions here

                          2. +
                          +

                          Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                          +
                            +
                          1. Access Scylla-Grafana-monitoring directory

                          2. +
                          +
                          cd scylla-monitoring-scylla-monitoring-4.3.4/
                          +
                          +
                          +
                            +
                          1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                          2. +
                          +
                          sudo cp -r grafana/plugins /var/lib/grafana/
                          +
                          +
                          +

                          If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                          +

                          For example:

                          +
                          cp -r grafana/plugins ../grafana-7.5.7/public/app
                          +
                          +
                          +
                            +
                          1. Provision the Dashboards

                          2. +
                          +

                          For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                          +

                          For Grafana installed with yum install

                          +
                          sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                          +sudo mkdir -p /var/lib/grafana/dashboards
                          +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                          +
                          +
                          +

                          For Grafana installed from packages

                          +
                          cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                          +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                          +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                          +
                          +
                          +

                          Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                          +
                          +

                          Note

                          +

                          A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                          +
                          +
                            +
                          1. Set the data source by copy datasource.yml and edit it

                          2. +
                          +
                          sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                          +
                          +
                          +
                          +

                          Note

                          +

                          Scylla uses a plugin to read from some system tables see the section below about using it.

                          +
                          +

                          For Grafana installed from packages

                          +
                          cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                          +
                          +
                          +

                          You should set the Prometheus and the alertmanager IP and port.

                          +

                          For example

                          +
                          sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                          +apiVersion: 1
                          +datasources:
                          + - name: prometheus
                          +   type: prometheus
                          +   url: http://192.168.135.167:9090
                          +   access: proxy
                          +   basicAuth: false
                          +
                          + - name: alertmanager
                          +   type: camptocamp-prometheus-alertmanager-datasource
                          +   orgId: 1
                          +   typeLogoUrl: public/img/icn-datasource.svg
                          +   access: proxy
                          +   url: http://192.168.135.166:9093
                          +   password:
                          +   user:
                          +   database:
                          +   basicAuth:
                          +   isDefault:
                          +   jsonData:
                          +     severity_critical: '4'
                          +     severity_high: '3'
                          +     severity_warning: '2'
                          +     severity_info: '1'
                          +
                          +
                          +
                            +
                          1. Start the Grafana service

                          2. +
                          +

                          For Grafana installed with yum install

                          +

                          sudo service grafana-server start

                          +

                          For Grafana installed from packages:

                          +

                          cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                          +

                          Edit scylla.ini to reflect the right paths in the paths section of the file.

                          +
                          plugins = /home/centos/grafana-7.5.7/data/plugins
                          +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                          +
                          +
                          +

                          Start the server:

                          +
                          cd /home/centos/grafana-7.5.7/
                          +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                          +
                          +
                          +
                            +
                          1. Make sure Grafana is running

                          2. +
                          +

                          Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                          +../_images/grafana.png +
                          +
                          +

                          Using Scylla Plugin with Grafana

                          +

                          Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                          +

                          Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                          +
                          +

                          Setting a monitoring user

                          +

                          This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                          +
                            +
                          • If you have not done so, enable authorization first.

                          • +
                          • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                          • +
                          • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                          • +
                          +
                          +
                          +

                          Installing the Plugin

                          +

                          Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                          +
                          +
                          +

                          Configure the Plugin

                          +

                          Add an entry to the datasource.yml file

                          +
                          - name: scylla-datasource
                          +  type: scylladb-scylla-datasource
                          +  orgId: 1
                          +  isDefault:
                          +  jsonData:
                          +  host: ''
                          +#  secureJsonData:
                          +#    user: 'scylla_monitoring'
                          +#    password: 'scylla_monitoring'
                          +
                          +
                          +

                          As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                          +
                          +
                          +

                          Enable the Plugin

                          +

                          Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                          +

                          See more about it the Grafana configurtion.

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/monitoring_stack.html b/branch-4.3/install/monitoring_stack.html new file mode 100644 index 000000000..d33acae82 --- /dev/null +++ b/branch-4.3/install/monitoring_stack.html @@ -0,0 +1,1090 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Install Scylla Monitoring Stack

                          +

                          This document describes the setup of Scylla Monitoring Stack, based on Scylla Prometheus API

                          +

                          The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                          +

                          For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                          +
                          +

                          Minimal Production System Recommendations

                          +
                            +
                          • CPU - at least 2 physical cores/ 4vCPUs

                          • +
                          • Memory - 15GB+ DRAM and proportional to the number of cores.

                          • +
                          • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                          • +
                          • Network - 1GbE/10GbE preferred

                          • +
                          +
                          +

                          Calculating Prometheus Minimal Disk Space requirement

                          +

                          Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                          +

                          Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                          +

                          For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                          +
                          6 * 16 * 15 * 12MB ~ 16GB
                          +
                          +
                          +

                          To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                          +
                          +
                          +

                          Calculating Prometheus Minimal Memory Space requirement

                          +

                          Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                          +

                          For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                          + +
                          + +++++++ + + + +
                          # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                          00
                          + +
                          +
                          +
                          +
                          +

                          Prerequisites

                          +
                            +
                          • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                          • +
                          • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                          • +
                          + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          Scylla Monitoring Stack Compatibility Matrix

                          Scylla Monitoring Stack Version

                          Prometheus Version

                          Grafana Version

                          4.3

                          2.42.0

                          9.3.8

                          4.2

                          2.41.0

                          9.3.4

                          4.1

                          2.38.0

                          9.1.0

                          4.0

                          2.34.0

                          8.5.2

                          3.11

                          2.32.0

                          8.3.4

                          3.10

                          2.32.0

                          8.3.3

                          3.9.2

                          2.29.1

                          8.2.7

                          3.9

                          2.29.1

                          8.1.1

                          3.8

                          2.27.1

                          7.5.7

                          3.7

                          2.25.2

                          7.4.0

                          3.6

                          2.18.1

                          7.3.5

                          3.5

                          2.18.1

                          7.1.5

                          3.4

                          2.18.1

                          6.7.3

                          +
                          +
                          +

                          Docker Post Installation

                          +

                          Docker post installation guide can be found here

                          +
                          +

                          Note

                          +

                          Avoid running the container as root.

                          +
                          +

                          To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                          +
                            +
                          1. Create the Docker group.

                          2. +
                          +
                          sudo groupadd docker
                          +
                          +
                          +
                            +
                          1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                          2. +
                          +
                          sudo usermod -aG docker $USER
                          +
                          +
                          +
                            +
                          1. Start Docker by calling:

                          2. +
                          +
                          sudo systemctl enable docker
                          +
                          +
                          +
                          +
                          +

                          Install Scylla Monitoring Stack

                          +

                          Procedure

                          +
                            +
                          1. Download and extract the latest Scylla Monitoring Stack binary;.

                          2. +
                          +
                          wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.3.4.tar.gz
                          +tar -xvf scylla-monitoring-4.3.4.tar.gz
                          +cd scylla-monitoring-scylla-monitoring-4.3.4
                          +
                          +
                          +

                          As an alternative, you can clone and use the Git repository directly.

                          +
                          git clone https://github.com/scylladb/scylla-monitoring.git
                          +cd scylla-monitoring
                          +git checkout branch-4.3
                          +
                          +
                          +
                            +
                          1. Start Docker service if needed

                          2. +
                          +
                          sudo systemctl restart docker
                          +
                          +
                          +
                          +
                          +

                          Configure Scylla Monitoring Stack

                          +

                          To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                          +

                          This configuration can be done from files, or using the Consul api.

                          +

                          Scylla Manager 2.0 and higher supports the Consul API.

                          +
                          +

                          Configure Scylla nodes from files

                          +
                            +
                          1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                          2. +
                          +
                          +

                          Note

                          +

                          It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                          +
                          +

                          For example:

                          +
                          - targets:
                          +      - 172.17.0.2
                          +      - 172.17.0.3
                          +  labels:
                          +      cluster: cluster1
                          +      dc: dc1
                          +
                          +
                          +
                          +

                          Note

                          +

                          If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                          +
                          +

                          Using IPV6

                          +

                          To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                          +

                          For example:

                          +
                          - targets:
                          +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                          +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                          +  labels:
                          +      cluster: cluster1
                          +      dc: dc1
                          +
                          +
                          +
                          +

                          Note

                          +

                          For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                          +
                          +

                          For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                          +
                          +

                          Note

                          +

                          By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                          +
                          +

                          If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                          +

                          For example:

                          +
                          ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                          +
                          +
                          +

                          Mark the different Data Centers with Labels.

                          +

                          As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                          +

                          You can use the genconfig.py script to generate the server file. For example:

                          +
                          ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                          +
                          +
                          +

                          This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                          +

                          OR

                          +

                          The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                          +
                          nodetool status | ./genconfig.py -NS
                          +
                          +
                          +

                          2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                          +

                          You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                          +

                          For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                          +
                          # List Scylla Manager end points
                          +
                          +- targets:
                          +  - 172.17.0.7:5090
                          +
                          +
                          +

                          Note that you do not need to add labels to the Scylla Manager targets.

                          +
                          +
                          +

                          Configure Scylla nodes using Scylla-Manager Consul API

                          +

                          Scylla Manager 2.0 has a Consul like API.

                          +

                          When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                          +

                          For example:

                          +
                          ./start-all.sh -L 10.10.0.1
                          +
                          +
                          +
                          +

                          Note

                          +

                          If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                          +
                          +
                          +
                          +

                          Connecting Scylla-Monitoring to ScyllaDB

                          +

                          Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                          +

                          You can limit the user to read only, currently it only read table from the system keyspace.

                          +

                          You can set a user and password from a file or environment variables.

                          +

                          If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                          +

                          To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                          +
                          +

                          Note

                          +

                          It is best to use a dedicated user and password with limited privileges.

                          +
                          +
                          +
                          +

                          Use an external directory for the Prometheus data directory

                          +

                          The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                          +
                          +

                          Note

                          +

                          Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                          +
                          +

                          If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                          +

                          In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                          +
                          +
                          +

                          Add Additional Prometheus Targets

                          +

                          There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                          +

                          The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                          +

                          You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                          +
                          - job_name: 'myservice'
                          +  # Override the global default and scrape targets from this job every 5 seconds.
                          +  scrape_interval: 5s
                          +  static_configs:
                          +    - targets:
                          +      - 17.0.0.1:7000
                          +
                          +
                          +
                          +
                          +
                          +

                          Start and Stop Scylla Monitoring Stack

                          +
                          +

                          Start

                          +
                          ./start-all.sh -d prometheus_data
                          +
                          +
                          +
                          +
                          +

                          Stop

                          +
                          ./kill-all.sh
                          +
                          +
                          +
                          +
                          +

                          Start a Specific Scylla Monitoring Stack Version

                          +

                          By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                          +

                          You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                          +

                          Multiple versions are supported. For example:

                          +
                          ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                          +
                          +
                          +

                          will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                          +
                          +
                          +

                          Accessing the localhost

                          +

                          The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                          +
                          ./start-all.sh -l -d prometheus-data
                          +
                          +
                          +
                          +
                          +

                          Configure rsyslog on each Scylla node

                          +

                          generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                          +

                          Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                          +

                          Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                          +

                          If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                          +
                          if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                          +
                          +
                          +

                          Restart rsyslog for the configuration to take effect.

                          +
                          systemctl restart rsyslog
                          +
                          +
                          +
                          +
                          +
                          +

                          View Grafana Dashboards

                          +

                          Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/start_all.html b/branch-4.3/install/start_all.html new file mode 100644 index 000000000..575c0e20a --- /dev/null +++ b/branch-4.3/install/start_all.html @@ -0,0 +1,751 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          The start-all.sh Command

                          +

                          Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                          +

                          The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                          +
                          +

                          General Options

                          +

                          -h Help, Print the help, and exit.

                          +

                          –version print the current Scylla-Monitoring stack version, and exit.

                          +

                          -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                          +

                          -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                          +

                          -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                          +

                          –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                          +
                          + + +
                          +

                          Alert Manager

                          +

                          The Alertmanager handles the alerts and takes the following parameters:

                          +

                          -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                          +

                          -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                          +

                          -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/install/thanos.html b/branch-4.3/install/thanos.html new file mode 100644 index 000000000..e31636a6f --- /dev/null +++ b/branch-4.3/install/thanos.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Using Thanos as Data Source With Scylla Monitoring Stack

                          +

                          Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                          +
                            +
                          • High-availability.

                          • +
                          • Horizontal scaling.

                          • +
                          • Backup.

                          • +
                          +

                          The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                          +

                          The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                          +
                          +

                          Using Thanos As a Prometheus Aggregator

                          +

                          There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                          +
                          +

                          Prometheus Configuration

                          +

                          We will assume you have two Prometheus servers running.

                          +
                            +
                          1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                          2. +
                          3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                          4. +
                          +
                          +
                          +

                          Thanos sidecar

                          +

                          The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                          +
                          docker run -d \
                          + -v /path/to/prom/dir:/data/prom:z \
                          + -i --name sidecar thanosio/thanos \
                          + sidecar \
                          + --grpc-address=0.0.0.0:10911 \
                          + --grpc-grace-period=1s \
                          + --http-address=0.0.0.0:10912 \
                          + --http-grace-period=1s \
                          + --prometheus.url=http://prometheus-ip:9090 \
                          + --tsdb.path=/data/prom \
                          + -p 10912:10912 \
                          + -p 10911:10911
                          +
                          +
                          +

                          After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                          +
                          +
                          +

                          Thanos query

                          +

                          Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                          +
                          docker run -d \
                          + --name thanos -- thanosio/thanos \
                          +   query \
                          +   --debug.name=query0 \
                          +   --log.level=debug \
                          +   --grpc-address=0.0.0.0:10903 \
                          +   --grpc-grace-period=1s \
                          +   --http-address=0.0.0.0:10904 \
                          +   --http-grace-period=1s \
                          +   --query.replica-label=prometheus \
                          +   --store={ip1}:10911 --store={ip2}:10911
                          +
                          +
                          +

                          After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                          +
                          +
                          +

                          Update Scylla Data source

                          +

                          The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                          +

                          The file you edit is a template file that replaces the file Grafana uses, next time you start.

                          +

                          Restart the Scylla Monitoring Stack it should now use Thanos.

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/intro.html b/branch-4.3/intro.html new file mode 100644 index 000000000..3d0378163 --- /dev/null +++ b/branch-4.3/intro.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          ScyllaDB Monitoring Stack

                          +

                          ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                          +_images/monitor.png +

                          The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                          +
                            +
                          • prometheus - Collects and stores metrics

                          • +
                          • grafan-loki - Parses logs and generates metrics and alerts

                          • +
                          • alertmanager - Handles alerts

                          • +
                          • grafana - Dashboards server

                          • +
                          +

                          A few optional components are used for additional services

                          +
                            +
                          • grafana-image-renderer - Allows you to download a dashboard as an image.

                          • +
                          • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                          • +
                          +
                          +

                          High Level Architecture

                          +_images/monitoring_stack1.png +

                          We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                          +

                          We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                          +

                          The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                          +

                          We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                          +

                          Choose a topic to get started:

                          + +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/objects.inv b/branch-4.3/objects.inv new file mode 100644 index 000000000..4824b5791 Binary files /dev/null and b/branch-4.3/objects.inv differ diff --git a/branch-4.3/procedures/alerts/alerting.html b/branch-4.3/procedures/alerts/alerting.html new file mode 100644 index 000000000..410db6da2 --- /dev/null +++ b/branch-4.3/procedures/alerts/alerting.html @@ -0,0 +1,749 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Alerting

                          +

                          Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                          +

                          You can read more about Prometheus alerting here

                          +

                          By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                          +

                          In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                          +

                          The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                          +../../_images/monitoring_stack.png +
                          +

                          Prometheus Alerts

                          +

                          The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                          +

                          Each alert consists of:

                          +
                            +
                          • Name

                          • +
                          • What happened

                          • +
                          • For how long

                          • +
                          • What to report

                          • +
                          +

                          For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                          +
                          - alert: InstanceDown
                          +  expr: up == 0
                          +  for: 60s
                          +  labels:
                          +    severity: "2"
                          +  annotations:
                          +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                          +    summary: Instance {{ $labels.instance }} down
                          +
                          +
                          +

                          The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                          +

                          The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                          +

                          The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                          +

                          annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                          +
                          +
                          +

                          Alertmanager

                          +

                          The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                          +

                          The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                          +
                            +
                          • Routes: Represent a routing tree, the most specific rule, wins

                          • +
                          • Inhibition: Mute an alert, based on another alert

                          • +
                          • Receiver: Send a notification via email, sluck, etc’

                          • +
                          +

                          Check the Alertmanager documentation for details on how to specify a specific receiver.

                          +

                          In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                          +
                          +
                          +

                          Tips When Adding an Alert

                          +

                          It’s worse having an alert that does not work, than not having an alert at all

                          +

                          There are multiple ways you can use to make sure your alert is set correctly:

                          +
                            +
                          • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                          • +
                          • Force the alert to be active by reducing the limits or the duration.

                          • +
                          • When possible simulate the actual scenario and see that the alert works as expected.

                          • +
                          +

                          For example, low available disk space.

                          +

                          Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                          +

                          Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                          +

                          Starting with a simple working expression helps you bisect problems.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/procedures/alerts/index.html b/branch-4.3/procedures/alerts/index.html new file mode 100644 index 000000000..eb3c73b52 --- /dev/null +++ b/branch-4.3/procedures/alerts/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Alert Manager

                          +
                          +
                          +

                          Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/procedures/datadog/index.html b/branch-4.3/procedures/datadog/index.html new file mode 100644 index 000000000..6d656bf61 --- /dev/null +++ b/branch-4.3/procedures/datadog/index.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Datadog Integration

                          +

                          The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                          +
                            +
                          1. Installing and configuring the Datadog Agent.

                          2. +
                          3. Add datadog recording rules.

                          4. +
                          5. Loading Scylla dashboard to Datadog.

                          6. +
                          7. Optionally load Monitor (Alerts).

                          8. +
                          +
                          +

                          Note

                          +

                          Scylla Cloud users, use and update the proper configuration file.

                          +
                          +
                          +

                          Install And configure the Datadog Agent

                          +

                          Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                          +

                          Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                          +
                          +

                          Scylla Cloud Users

                          +

                          Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                          +

                          Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                          +
                          +
                          +

                          Other Scylla Users

                          +

                          Other Scylla users, download the configuration file conf.yaml and replace the ip address of the promemtheus server.

                          +
                          +
                          +

                          Post configuration

                          +

                          Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                          +
                          +

                          Note

                          +

                          By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                          +
                          +
                          +
                          +
                          +

                          Add datadog recording rules

                          +

                          Non cloud users, download the rules configuration file datadog.rules.yml and place it under prometheus/prom_rules/.

                          +
                          +
                          +

                          Upload the Dashboard

                          +

                          Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                          +
                          +
                          +

                          Using the Dashboard

                          +

                          We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                          +../../_images/datadog.png +

                          The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                          +
                          +

                          Note

                          +

                          Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                          +
                          +
                          +
                          +

                          Adding Monitor

                          +

                          Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/procedures/index.html b/branch-4.3/procedures/index.html new file mode 100644 index 000000000..3bf0936c8 --- /dev/null +++ b/branch-4.3/procedures/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          ScyllaDB Monitoring Stack Procedures

                          +
                          +
                          +

                          There are several reference guides available which give additional information. Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/procedures/updating_dashboard.html b/branch-4.3/procedures/updating_dashboard.html new file mode 100644 index 000000000..10c9e7636 --- /dev/null +++ b/branch-4.3/procedures/updating_dashboard.html @@ -0,0 +1,958 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Adding and Modifying Dashboards

                          +

                          This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                          +

                          It covers dashboard templates and how to modify them.

                          + +
                          +

                          General Limitations

                          +

                          Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                          +
                          +

                          Consistency Between Restarts

                          +

                          By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                          +
                          +
                          +

                          Consistency Between Upgrades

                          +

                          As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                          +
                          +

                          Note

                          +

                           You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                          +
                          +

                          At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                          +
                          +
                          +
                          +

                          Using Templated Dashboards

                          +

                          Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                          +

                          Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                          +

                          For example a typical graph panel would look like this:

                          +
                          {
                          +    "aliasColors": {},
                          +    "bars": false,
                          +    "datasource": "prometheus",
                          +    "editable": true,
                          +    "error": false,
                          +    "fill": 0,
                          +    "grid": {
                          +        "threshold1": null,
                          +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                          +        "threshold2": null,
                          +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                          +    },
                          +    "gridPos": {
                          +        "h": 6,
                          +        "w": 10,
                          +        "x": 0,
                          +        "y": 4
                          +    },
                          +    "id": 2,
                          +    "isNew": true,
                          +    "legend": {
                          +        "avg": false,
                          +        "current": false,
                          +        "max": false,
                          +        "min": false,
                          +        "show": false,
                          +        "total": false,
                          +        "values": false
                          +    },
                          +    "lines": true,
                          +    "linewidth": 2,
                          +    "links": [],
                          +    "nullPointMode": "connected",
                          +    "percentage": false,
                          +    "pointradius": 5,
                          +    "points": false,
                          +    "renderer": "flot",
                          +    "seriesOverrides": [
                          +        {}
                          +    ],
                          +    "span": 5,
                          +    "stack": false,
                          +    "steppedLine": false,
                          +    "targets": [
                          +        {
                          +            "expr": "sum(node_filesystem_avail) by (instance)",
                          +            "intervalFactor": 1,
                          +            "legendFormat": "",
                          +            "refId": "A",
                          +            "step": 1
                          +        }
                          +    ],
                          +    "timeFrom": null,
                          +    "timeShift": null,
                          +    "title": "Available Disk Size",
                          +    "tooltip": {
                          +        "msResolution": false,
                          +        "shared": true,
                          +        "sort": 0,
                          +        "value_type": "cumulative"
                          +    },
                          +    "transparent": false,
                          +    "type": "graph",
                          +    "xaxis": {
                          +        "show": true
                          +    },
                          +    "yaxes": [
                          +        {
                          +            "format": "percent",
                          +            "logBase": 1,
                          +            "max": 101,
                          +            "min": 0,
                          +            "show": true
                          +        },
                          +        {
                          +            "format": "short",
                          +            "logBase": 1,
                          +            "max": null,
                          +            "min": null,
                          +            "show": true
                          +        }
                          +    ]
                          +}
                          +
                          +
                          +

                          As you can imagine, most panels would have similar values.

                          +

                          To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                          +
                          +

                          The Template Class System

                          +

                          The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                          +

                          The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                          +

                          In the template file, you can also add or override attributes.

                          +

                          The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                          +

                          When generating dashboards, each class will be replaced by its definition.

                          +

                          For example, a row in the type.json is defined as:

                          +
                          {
                          + "base_row": {
                          +     "collapse": false,
                          +     "editable": true
                          + },
                          + "row": {
                          +     "class": "base_row",
                          +     "height": "250px"
                          + }
                          + }
                          +
                          +
                          +

                          Will be used like in a template:

                          +
                          {
                          +     "class": "row",
                          +     "height": "150px",
                          +     "panels": [
                          +     ]
                          +}
                          +
                          +
                          +

                          And the output will be:

                          +
                          {
                          +     "class": "row",
                          +     "collapse": false,
                          +     "editable": true,
                          +     "height": "150px",
                          +     "panels": [
                          +
                          +     ]
                          +}
                          +
                          +
                          +

                          We can see that the template added the panels attribute and that it overrides the height attribute.

                          +
                          +
                          +

                          Panel Example

                          +

                          Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                          +
                          {
                          +     "class": "row",
                          +     "panels": [
                          +         {
                          +             "class": "bytes_panel",
                          +             "span": 3,
                          +             "targets": [
                          +                 {
                          +                     "expr": "sum(node_filesystem_avail) by (instance)",
                          +                     "intervalFactor": 1,
                          +                     "legendFormat": "",
                          +                     "metric": "",
                          +                     "refId": "A",
                          +                     "step": 1
                          +                 }
                          +             ],
                          +             "title": "Available Disk Size"
                          +         }
                          +     ]
                          +}
                          +
                          +
                          +

                          In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                          +

                          You can also see that the span attribute is overridden to set the panel size.

                          +

                          To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                          +
                          +
                          +

                          Grafana Formats and Layouts

                          +

                          The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                          +

                          Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                          +

                          The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                          +

                          To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                          +

                          The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                          +

                          You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                          +

                          gridPos has the following attributes:

                          +
                          {
                          +   "x": 0,
                          +   "y": 0,
                          +   "w": 24,
                          +   "h": 4
                          + }
                          +
                          +
                          +

                          When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                          +
                          {
                          +   "gridPos": {
                          +      "h": 2
                          +    }
                          +}
                          +
                          +
                          +
                          +
                          +

                          Generating the dashboards from templates (generate-dashboards.sh)

                          +
                          +

                          Prerequisite

                          +

                          Python 2.7

                          +

                          make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                          +

                          Use the -h flag to get help information.

                          +

                          You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                          +

                          When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                          +

                          For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                          +

                          .\generate-dashboards.sh -v 2020.1

                          +
                          +

                          Note

                          +

                          generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                          +
                          +
                          +
                          +
                          +

                          Validation

                          +

                          After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                          +

                          Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/reference/index.html b/branch-4.3/reference/index.html new file mode 100644 index 000000000..19e8fb863 --- /dev/null +++ b/branch-4.3/reference/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Reference Guide

                          +
                          +
                          +

                          There are several reference guides available which give additional information. Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/reference/matrix.html b/branch-4.3/reference/matrix.html new file mode 100644 index 000000000..f66b8dc7a --- /dev/null +++ b/branch-4.3/reference/matrix.html @@ -0,0 +1,830 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Support Matrix

                          +

                          The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                          + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                          Scylla Monitoring Stack Version

                          Scylla Open Source Version

                          Scylla Enterprise Version

                          Node_exporter[1] Version

                          Scylla Manager Version

                          4.3

                          5.0,5.1,5.2

                          2020.1, 2021.1, 2022.1, 2022.2

                          1.4.1

                          2.5, 2.6, 3.0

                          4.2

                          4.5,4.6,5.0,5.1

                          2020.1, 2021.1, 2022.1, 2022.2

                          1.4.1

                          2.5, 2.6, 3.0

                          4.1

                          4.5,4.6,5.0,5.1

                          2020.1, 2021.1, 2022.1, 2022.2

                          0.17

                          2.5, 2.6, 3.0

                          4.0

                          4.3, 4.4, 4.5, 4.6, 5.0

                          2020.1, 2021.1, 2022.1

                          0.17

                          2.3, 2.4, 2.5, 2.6, 3.0

                          3.11

                          4.3, 4.4, 4.5, 4.6, 5.0

                          2020.1, 2021.1, 2022.2

                          0.17

                          2.3, 2.4, 2.5, 2.6

                          3.10

                          4.3, 4.4, 4.5, 4.6

                          2020.1, 2021.1

                          0.17

                          2.3, 2.4, 2.5, 2.6

                          3.9

                          4.3, 4.4, 4.5, 4.6

                          2020.1, 2021.1

                          0.17

                          2.3, 2.4, 2.5

                          3.8

                          4.3, 4.4, 4.5

                          2020.1, 2021.1

                          0.17

                          2.3, 2.4, 2.5

                          3.7

                          4.2, 4.3, 4.4

                          2019.1, 2020.1, 2021.1

                          0.17

                          2.2, 2.3

                          3.6.3

                          4.2, 4.3, 4.4

                          2019.1, 2020.1, 2021.1

                          0.17

                          2.2, 2.3, 2.1

                          3.6

                          4.1, 4.2, 4.3

                          2019.1, 2020.1

                          0.17

                          2.1, 2.2, 2.3

                          3.6.1

                          4.1, 4.2, 4.3

                          2019.1, 2020.1

                          0.17

                          2.1, 2.2

                          3.6.1

                          4.1, 4.2, 4.3, 4.4

                          2019.1, 2020.1

                          0.17

                          2.1, 2.2

                          3.5

                          3.3, 4.0, 4.1, 4.2

                          2019.1, 2020.1

                          0.17

                          2.0, 2.1, 2.2

                          3.4.3

                          3.3, 4.0, 4.1, 4.2

                          2019.1, 2020.1

                          0.17

                          2.0, 2.1

                          3.4

                          3.3, 4.0, 4.1

                          2018.1, 2019.1

                          0.17

                          2.0, 2.1

                          3.3

                          3.1, 3.2, 3.3, 4.0

                          2018.1, 2019.1

                          0.17

                          1.4, 2.0, 2.1

                          3.2

                          3.1, 3.2, 3.3

                          2018.1, 2019.1

                          0.17

                          1.4, 2.0

                          3.1

                          2.3, 3.0, 3.1, 3.2

                          2018.1, 2019.1

                          0.17

                          1.3, 1.4, 2.0

                          3.0

                          2.3, 3.0, 3.1, 3.2

                          2018.1, 2019.1

                          0.17

                          1.3, 1.4

                          2.4

                          2.3, 3.0, 3.1

                          2018.1, 2019.1

                          0.14, 0.17

                          1.3, 1.4

                          2.3

                          2.3, 3.0

                          2018.1, 2019.1

                          0.14, 0.17

                          1.3

                          2.2

                          2.3, 3.0

                          2018.1, 2019.1

                          0.14, 0.17

                          1.3

                          2.1

                          2.3, 3.0

                          2018.1

                          0.14, 0.17

                          1.3

                          +

                          [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/reference/monitoring_apis.html b/branch-4.3/reference/monitoring_apis.html new file mode 100644 index 000000000..c2ce76374 --- /dev/null +++ b/branch-4.3/reference/monitoring_apis.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Interfaces

                          +

                          Scylla exposes two interfaces for online monitoring, as described below

                          +
                          +

                          Prometheus

                          +

                          By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                          +

                          For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                          +

                          You can change the Prometheus listening address and port in scylla.yaml file

                          +
                          # prometheus port
                          +# By default, Scylla opens prometheus API port on port 9180
                          +# setting the port to 0 will disable the prometheus API.
                          +prometheus_port: 9180
                          +#
                          +# prometheus address
                          +# By default, Scylla binds all interfaces to the prometheus API
                          +# It is possible to restrict the listening address to a specific one
                          +prometheus_address: 0.0.0.0
                          +
                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/robots.txt b/branch-4.3/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.3/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.3/search.html b/branch-4.3/search.html new file mode 100644 index 000000000..bdd0a75a3 --- /dev/null +++ b/branch-4.3/search.html @@ -0,0 +1,643 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + + + +
                          + + + + + +
                          + + +
                          + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/searchindex.js b/branch-4.3/searchindex.js new file mode 100644 index 000000000..6a3e9d871 --- /dev/null +++ b/branch-4.3/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["_common/monitor-description", "index", "install/docker_compose", "install/index", "install/min-prod-hw", "install/monitor_without_docker", "install/monitoring_stack", "install/start_all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating_dashboard", "reference/index", "reference/matrix", "reference/monitoring_apis", "troubleshooting/index", "troubleshooting/monitor_troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql_optimization", "use-monitoring/index"], "filenames": ["_common/monitor-description.rst", "index.rst", "install/docker_compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor_without_docker.rst", "install/monitoring_stack.rst", "install/start_all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating_dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring_apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor_troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql_optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "3": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 19, 22, 24, 25, 29, 30, 32, 33, 35, 37, 38], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 26, 27, 28, 29, 32, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 26], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 29, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 27, 28, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 26, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 27, 34, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 33], "user": [1, 2, 6, 7, 9, 26, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9, 32], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 28, 29], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 26, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 19, 21, 22, 23, 24, 25, 29, 31, 33, 34, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 29, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 26, 30, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 31, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 27, 30, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 26, 29, 32, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 14, 19, 21, 22, 23, 24, 25], "onc": [2, 12, 21, 25, 31, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 34, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 32, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 30, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 27, 29, 30, 33, 34, 35, 41], "both": [2, 5, 6, 19, 22, 24, 25, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 26, 39, 41], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 28, 33, 34, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 34, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 27, 33, 34, 41], "advis": [2, 34], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25], "databas": [2, 5, 7, 21, 29, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 30, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 32, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 32, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 31, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "1": [2, 5, 6, 7, 8, 12, 14, 16, 20, 22, 24, 25], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 27, 28, 29, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "21": 2, "0": [2, 5, 6, 7, 8, 10, 14, 16, 17, 21, 22, 23, 24, 25], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "7": [2, 5, 6, 14, 16], "5": [2, 5, 6, 14, 16, 19], "3000": [2, 5, 6, 22, 24, 25], "1000": [2, 33], "build": [2, 5], "plugin": 2, "uncom": [2, 6], "persist": [2, 4, 5, 6, 7, 14, 28, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25], "dir": [2, 7, 8, 22, 24, 25], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 10, 12, 14, 16, 20, 24, 35], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 31, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "18": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 27, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 29, 34, 35, 37, 39, 41], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 33, 39], "section": [4, 5, 6, 12, 19, 21, 24, 25, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 29, 35, 37, 41], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 30, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 38], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 27, 28, 29, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 32, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 27, 29, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 29, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 31, 39, 41], "need": [4, 5, 6, 7, 8, 14, 19, 25, 27, 28, 29, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 27, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 27, 34, 41], "out": [4, 5, 6, 8, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 26, 29, 41], "take": [4, 5, 6, 7, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25], "help": [5, 7, 10, 14, 41], "pleas": [5, 19], "most": [5, 10, 14, 25, 34, 36, 41], "current": [5, 6, 7, 10, 14, 19, 22, 24, 25], "common": [5, 7, 41], "scenario": [5, 10], "who": 5, "own": [5, 6, 7, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 27, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 27, 28, 35, 41], "support": [5, 6, 14, 15, 26, 32, 41], "want": [5, 6, 10, 22, 24, 25], "latest": [5, 6, 7, 22, 24, 25], "releas": [5, 21, 22, 23, 24, 25], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25], "http": [5, 6, 8, 19, 21, 22, 24, 25, 29, 30, 32, 38], "com": [5, 6, 22, 24, 25, 29, 30, 32, 38], "archiv": [5, 6, 22, 24, 25], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25], "p": [5, 7, 8, 19, 21, 22, 24, 25], "home": 5, "cd": [5, 6, 22, 24, 25], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25], "browser": [5, 6, 8, 14, 19, 22, 24, 25], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 31, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 12, 19, 25, 26, 29, 30, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 27, 30, 31, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 29, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 14, 26, 27, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25], "scrap": [5, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 19, 21, 23, 25, 29, 31, 33, 39, 41], "import": [5, 6, 7, 12, 21, 22, 24, 25, 33], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25], "code": [5, 34], "shell": 5, "prom_rul": [5, 12, 25], "correct": [5, 23], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 32], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 34, 41], "typic": [5, 14, 25, 27, 29, 39, 41], "node_export": [5, 6, 7, 9, 16], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 30, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 19, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7, 19], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 26, 31], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24], "scylla_reactor_util": 5, "At": [5, 14, 24, 25], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 27, 28, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 34, 38], "tabl": [5, 6, 10, 16, 26, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 33, 34, 41], "give": [5, 13, 15], "strongli": 5, "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 26, 29, 34, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 31, 33], "mention": [5, 14], "previous": [5, 24, 25], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 30, 33, 41], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "42": 6, "9": [6, 16, 25], "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "11": [6, 16], "32": 6, "10": [6, 10, 14, 16], "29": 6, "25": [6, 19], "avoid": [6, 14, 19, 30, 32, 41], "root": [6, 19, 22, 24, 25], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 29, 41], "higher": [6, 25, 29, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 26, 27, 28], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 38], "place": [6, 7, 8, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 27, 29, 30, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25], "2019": [6, 16, 38], "reach": [6, 8, 12, 29, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 29, 30, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 28, 31, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 29, 30, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 26, 27, 28, 29, 30, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 34], "disk": [7, 10, 14, 19, 26, 28, 34], "possibl": [7, 10, 17, 32, 41], "api": [7, 8, 17, 21], "resolv": 7, "explicitli": [7, 14], "request": [7, 17, 34, 40], "how": [7, 8, 10, 14, 22, 24, 25, 27, 28, 29, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14, 34], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 28], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 27, 28, 29, 34, 35, 41], "abov": [8, 22, 24, 25], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 29, 38, 41], "email": [9, 10], "slack": [9, 10], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11, 34], "wrong": [10, 11, 14, 19, 25, 39, 41], "shown": [10, 19, 22, 24, 25], "overview": [10, 25, 34], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 32, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 42], "annot": 10, "descript": [10, 34], "been": 10, "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 41], "rout": [10, 29, 41], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 27], "simul": 10, "actual": [10, 37], "low": [10, 41], "space": 10, "lower": [10, 41], "fire": 10, "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 31, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "promemtheu": 12, "shard": [12, 19, 25, 34], "dd": 12, "non": [12, 19, 21, 28, 29, 34, 38, 41], "json": [12, 14], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "explain": [14, 22, 24, 25, 34], "intern": [14, 29, 41], "potenti": [14, 34, 41], "issu": [14, 19, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 34, 35, 37], "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 30, 41], "tooltip": 14, "msresolut": 14, "share": [14, 33], "sort": [14, 32, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 32, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 30, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "24": [14, 25], "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": [14, 34], "usual": [14, 19, 34, 41], "easier": 14, "wrapper": 14, "re": [14, 29], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2018": [16, 30], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "56090": 19, "old": [19, 22, 23, 24, 25], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 34, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": [19, 34], "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 29, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 26, 27, 28, 30, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "while": [19, 21, 22, 24, 25, 33], "dure": [19, 22, 24, 25], "fallback": 19, "mechan": [19, 25, 27], "present": [19, 25], "newer": [19, 24, 25], "reli": [19, 25, 41], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25], "increas": [19, 30, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25], "migrat": [21, 22, 24], "lose": 21, "histor": [21, 25], "process": [21, 33, 40], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25], "3001": [21, 22, 24, 25], "9091": [21, 22, 24, 25], "9094": 21, "fail": [21, 27, 29, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25], "back": [21, 27], "uninstal": [22, 24, 25], "minor": [22, 24, 25], "9095": [22, 24, 25], "brows": [22, 24, 25], "satisfi": [22, 24, 25], "shut": [22, 24, 25], "caus": [22, 24, 25, 29, 41], "blackout": [22, 24, 25], "normal": [22, 24, 25], "oper": [22, 24, 25, 34, 41], "complet": [22, 24, 25], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 34, 41], "ensur": 25, "patch": 25, "skip": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 28], "latenc": [25, 29, 33, 34, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 27], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 27, 28, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "primari": [26, 41], "kei": [26, 32, 41], "scan": 26, "These": [26, 41], "kind": [26, 41], "bigger": 26, "care": [26, 27, 28, 41], "replicationfactor": [27, 28], "piec": 27, "determin": [27, 28, 35, 41], "repli": [27, 28, 30, 35, 37, 41], "unavail": [27, 41], "client": [27, 30, 34, 41], "respond": 27, "accompani": 27, "deep": 27, "understand": 27, "acknowledg": 28, "coordin": [28, 29, 35, 37, 41], "hint": 28, "fact": 28, "yet": 28, "ideal": [29, 41], "resourc": [29, 32, 41], "replic": [29, 35, 37, 41], "prepar": [29, 34, 38], "statement": [29, 31, 34, 38], "balanc": [29, 33, 34, 41], "polici": 29, "cours": 29, "intro": 29, "recap": 29, "ring": [29, 41], "architectur": 29, "chunk": [30, 41], "overal": [30, 33, 41], "thu": 30, "www": [30, 38], "07": 30, "13": 30, "effici": [30, 41], "optim": [31, 38, 42], "concret": 31, "thumb": 31, "alwai": 31, "favor": 31, "partit": [32, 34], "BY": [32, 41], "ineffici": [32, 41], "consum": 32, "doc": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "practic": [34, 38], "solv": 34, "left": 34, "categori": [34, 41], "jump": 34, "warn": 34, "cell": 34, "model": [34, 38, 40, 41], "imbal": 34, "imbalanc": 34, "hot": 34, "bottleneck": [34, 38], "cach": 34, "hit": 34, "awar": 34, "order": [34, 41], "due": 34, "unsatisfi": 34, "faulti": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "explan": 38, "08": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "drop": [40, 41], "repair": 40, "que": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "prevent": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "cost": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 34, 42], "us": [2, 5, 6, 8, 12, 14, 26, 27, 28, 32, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 30, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": 6, "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 34, 41], "all": [7, 22, 24, 25, 27], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 26, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 27, 28, 35, 41], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25], "modifi": 14, "limit": 14, "consist": [14, 27, 28, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 29, 30, 31, 38], "empti": 19, "reduc": 19, "total": 19, "number": 19, "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25], "latest": 21, "new": [21, 22, 23, 24, 25], "4": [21, 25], "move": [21, 22, 24, 25], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25], "link": [21, 22, 23, 24, 25, 28, 29, 30, 32, 38], "y": [22, 24, 25], "": [22, 24, 25], "i": [22, 24, 25, 36], "run": [22, 24, 25], "correct": [22, 24, 25], "correctli": [22, 24], "kill": [22, 24, 25], "test": [24, 25], "mode": [24, 25], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [26, 27, 28, 29, 30, 31, 32, 35, 37], "allow": [26, 41], "filter": [26, 41], "ani": 28, "univers": [28, 29], "token": [29, 41], "awar": [29, 41], "select": 30, "non": [30, 31], "page": [30, 41], "blog": [30, 38], "prepar": [31, 39, 41], "revers": [32, 41], "order": 32, "document": 32, "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Some queries are non-prepared": [[31, "some-queries-are-non-prepared"]], "Some queries use reverse order": [[32, "some-queries-use-reverse-order"]], "Documentation link": [[32, "documentation-link"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some SELECT queries are non-paged": [[30, "some-select-queries-are-non-paged"]], "Blog-post Links": [[30, "blog-post-links"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Upgrade Procedure": [[25, "upgrade-procedure"], [21, "upgrade-procedure"], [22, "upgrade-procedure"], [24, "upgrade-procedure"], [23, "upgrade-procedure"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Setting the server\u2019s files": [[25, "setting-the-server-s-files"], [22, "setting-the-server-s-files"], [24, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[25, "validate-the-new-version-is-running-the-correct-version"], [22, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Kill all containers": [[25, "kill-all-containers"], [22, "kill-all-containers"], [24, "kill-all-containers"]], "Rollback to version 3.x": [[25, "rollback-to-version-3-x"], [24, "rollback-to-version-3-x"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Related Links": [[25, "related-links"], [21, "related-links"], [22, "related-links"], [24, "related-links"], [23, "related-links"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "2. Install the new monitoring stack": [[21, "install-the-new-monitoring-stack"], [23, "install-the-new-monitoring-stack"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Validate the upgrade": [[21, "validate-the-upgrade"], [23, "validate-the-upgrade"]], "Rollback": [[21, "rollback"], [23, "rollback"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Some queries are not token-aware": [[29, "some-queries-are-not-token-aware"]], "University link": [[29, "university-link"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Some queries use ALLOW FILTERING": [[26, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Some queries use Consistency Level: ANY": [[28, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[28, "link-to-scylla-university"]], "Some queries use Consistency Level: ALL": [[27, "some-queries-use-consistency-level-all"]], "System Overload": [[40, "system-overload"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus": [[17, "prometheus"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "ScyllaDB Monitoring Stack": [[1, "scylladb-monitoring-stack"], [9, "scylladb-monitoring-stack"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "High Level Architecture": [[9, "high-level-architecture"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.3/sitemap.xml b/branch-4.3/sitemap.xml new file mode 100644 index 000000000..fe52f9343 --- /dev/null +++ b/branch-4.3/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/_common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker_compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor_without_docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating_dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring_stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/install/start_all.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring_apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor_troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql_optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.3/troubleshooting/index.html b/branch-4.3/troubleshooting/index.html new file mode 100644 index 000000000..6debf8580 --- /dev/null +++ b/branch-4.3/troubleshooting/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Troubleshooting Guide for Scylla Monitoring Stack

                          +
                          +
                          +

                          Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/troubleshooting/monitor_troubleshoot.html b/branch-4.3/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..a9a9144fb --- /dev/null +++ b/branch-4.3/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,885 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Troubleshoot Scylla Monitoring Stack

                          +

                          This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                          +
                          +

                          Problem

                          +
                          +

                          Scylla-Manager 2.2 with Duplicate information

                          +

                          Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                          +
                            +
                          • For Manager server: from 56090 to 5090

                          • +
                          • For Manager Agent: from 56090 to 5090

                          • +
                          +

                          For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                          +

                          However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                          +

                          The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                          +

                          Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                          +
                          +
                          +

                          A Container Fails To Start

                          +

                          When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                          +
                          Wait for Prometheus container to start........Error: Prometheus container failed to start
                          +
                          +
                          +

                          Should this happen, check the Docker logs for more information.

                          +
                          docker logs aprom
                          +
                          +
                          +

                          Usually the reason for the failure is described in the logs.

                          +
                          +
                          +

                          Files And Directory Permissions

                          +
                          +

                          Note

                          +

                          Avoid running Docker containers as root.

                          +
                          +

                          The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                          +

                          If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                          +
                          +

                          Note

                          +

                          If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                          +
                          +

                          For example if your Prometheus data directory is /prom-data and you are using centos user

                          +
                          ls -la /|grep prom-data
                          +
                          +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                          +
                          +sudo chown -R centos:centos /prom-data
                          +
                          +ls -la /|grep prom-data
                          +
                          +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                          +
                          +
                          +
                          +
                          +

                          No Data Points

                          +

                          No data points on all data charts.

                          +
                          +

                          Solution

                          +

                          If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                          +
                            +
                          1. Login to the Prometheus console:

                          2. +
                          3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                          4. +
                          5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                          6. +
                          +
                          +
                            +
                          • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                          • +
                          • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                          • +
                          • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                          • +
                          +
                          +

                          For example:

                          +
                          ./start-all.sh -v 3.1
                          +
                          +
                          +

                          More on start-all.sh options.

                          +
                          +
                          +
                          +

                          Grafana Chart Shows Error (!) Sign

                          +

                          Run this procedure on the Scylla Monitoring Stack server.

                          +

                          If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                          +
                          +

                          Solution

                          +

                          On the Scylla Monitoring Stack server:

                          +
                            +
                          1. Check Prometheus is running using docker ps.

                          2. +
                          +
                            +
                          • If it is not running check the prometheus.yml for errors.

                          • +
                          +

                          For example:

                          +
                          CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                          +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                          +
                          +
                          +
                            +
                          • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                          • +
                          +
                          +
                          +
                          +

                          Grafana Shows Server Level Metrics, but not Scylla Metrics

                          +

                          Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                          +
                          +

                          Solution

                          +
                            +
                          • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                          • +
                          +

                          For example

                          +
                          curl 172.17.0.2:9180/metrics
                          +
                          +
                          +
                          +
                          +
                          +

                          Grafana Shows Scylla Metrics, but not Server Level Metrics

                          +

                          Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                          +
                          +

                          Solution

                          +

                          1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                          +
                            +
                          1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                          2. +
                          +
                          +
                          +

                          Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                          +

                          While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                          +

                          If the node_exporter service is not starting it may need to be updated manually.

                          +

                          Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                          +
                          +
                          +
                          +

                          Latencies Graphs Are empty

                          +

                          Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                          +

                          During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                          +

                          Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                          +

                          If only the latency graphs are missing, it is because of missing recording rules.

                          +

                          This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                          +

                          If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                          +
                          +
                          +

                          Reducing the total number of metrics

                          +

                          In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                          +
                          +

                          Remove interrupts from node_exporter

                          +

                          By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                          +
                          +
                          +
                          +

                          Working with Wireshark

                          +

                          No metrics shown in the Scylla Monitoring Stack.

                          +
                            +
                          1. Install wireshark

                          2. +
                          +

                          2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                          +

                          For example:

                          +
                          tshark -i eth0 -f "dst port 9180"
                          +
                          +
                          +

                          Capture from Scylla node towards Scylla Monitoring Stack server.

                          +

                          In this example, Scylla is running.

                          +
                          Monitor ip        Scylla node ip
                          +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                          +
                          +
                          +

                          In this example, Scylla is not running

                          +
                          Monitor ip        Scylla node ip
                          +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                          +
                          +
                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/index.html b/branch-4.3/upgrade/index.html new file mode 100644 index 000000000..4adeb970d --- /dev/null +++ b/branch-4.3/upgrade/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Scylla Monitoring Stack

                          +
                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..30e9f06ac --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 1.x to 2.x

                          +

                          Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                          +
                          +

                          Upgrade Procedure

                          +
                          +

                          1. Upgrade to the latest 1.x version

                          +

                          Before starting the upgrade procedure, make sure you are running the latest 1.x version

                          +
                          +
                          +

                          2. Install the new monitoring stack

                          +
                            +
                          1. Download the 2.x version from the release page.

                          2. +
                          3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                          4. +
                          5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                            +
                              +
                            • scylla_servers.yml

                            • +
                            • scylla_manager_servers.yml

                            • +
                            • node_exporter_servers.yml

                            • +
                            +
                          6. +
                          7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                          8. +
                          +
                          ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                          +
                          +
                          +
                          +

                          Note

                          +

                          Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                          +
                          +

                          While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                          +
                          ./kill-all.sh -g 3001 -p 9091 -m 9094
                          +
                          +
                          +
                          +

                          Validation

                          +

                          Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                          +
                          +
                          +
                          +

                          3. Alerting Rules

                          +

                          Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                          +
                          +
                          +

                          4. Moving to Prometheus 2.x

                          +

                          Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                          +

                          Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                          +
                          +

                          a. Set the old system

                          +

                          The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                          +
                            +
                          • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                          • +
                          • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                          • +
                          +
                          +

                          Note

                          +

                          After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                          +
                          +
                          +
                          +

                          b. Set the new system

                          +

                          The following step will allow the new monitoring system to read historical metrics from the old system.

                          +
                            +
                          • In the Prometheus prometheus.yml.template file add the following at the end:

                          • +
                          +
                          remote_read:
                          +  - url: "http://{ip}:9111/api/v1/read"
                          +
                          +
                          +

                          Where {ip} is the ip of the old system.

                          +
                            +
                          • restart the new stack

                          • +
                          +
                          +
                          +
                          +

                          Validate the upgrade

                          +

                          You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                          +
                          +
                          +
                          +

                          Rollback

                          +

                          In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..5e0e12aee --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                          +
                          +

                          Upgrade Procedure

                          +

                          We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                          +

                          Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                          +
                          +

                          Install 2.y (The new version)

                          +
                          wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                          +unzip scylla-monitoring-2.y.zip
                          +cd scylla-monitoring-scylla-monitoring-2.y/
                          +
                          +
                          +

                          Replace “y” with the new minor release number, for example, 2.1.zip

                          +
                          +
                          +

                          Setting the server’s files

                          +

                          Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                          +
                          cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                          +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                          +
                          +
                          +
                          +
                          +

                          Validate the new version is running the correct version

                          +

                          Starting from Scylla-Monitoring version 2.2, you can run:

                          +
                          ./start-all.sh --version
                          +
                          +
                          +

                          To validate the Scylla-Monitoring version.

                          +
                          +
                          +

                          Validate the version installed correctly

                          +

                          To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                          +
                          ./start-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          Browse to http://{ip}:9091 +And check the Grafana dashboard

                          +

                          Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                          +
                          +

                          Caution

                          +

                          Important: do not use the local dir flag when testing!

                          +
                          +

                          When you are satisfied with the data in the dashboard, you can shut down the containers.

                          +
                          +

                          Caution

                          +

                          Important: Do not kill the 2.x version that is currently running.

                          +
                          +

                          Use the following command to kill the containers:

                          +
                          ./kill-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          You can start and stop the new 2.y version while testing.

                          +
                          +
                          +

                          Move to version 2.y (the new version)

                          +

                          Note: migrating will cause a few seconds of blackout in the system.

                          +

                          We assume that you are using external volume to store the metrics data.

                          +
                          +

                          Kill all containers

                          +

                          Follow the instruction on how to kill the 2.y version when in testing mode.

                          +

                          To kill the 2.x version containers, run:

                          +
                          ./kill-all.sh
                          +
                          +
                          +

                          Start version 2.y in normal mode

                          +

                          From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                          +
                          ./start-all.sh -d /path/to/data/dir
                          +
                          +
                          +

                          Point your browser to http://{ip}:3000 and see that the data is there.

                          +
                          +
                          +
                          +

                          Rollback to version 2.x

                          +

                          To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                          +

                          To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                          +
                          ./kill-all.sh
                          +cd /path/to/scylla-grafana-2.x/
                          +./start-all.sh -d /path/to/data/dir
                          +
                          +
                          +
                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..986e12e34 --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,752 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 2.x to 3.x

                          +

                          Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                          +
                          +

                          Upgrade Procedure

                          +
                          +

                          1. Validate node_exporter version

                          +

                          Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                          +

                          If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                          +
                          +
                          +

                          2. Install the new monitoring stack

                          +
                            +
                          1. Download the 3.x version from the release page.

                          2. +
                          3. Unzip it into a different directory.

                          4. +
                          5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                            +
                              +
                            • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                            • +
                            • scylla_manager_servers.yml

                            • +
                            +
                            +
                            +

                            Note

                            +

                            The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                            +
                            +
                            +
                          6. +
                          7. Stop the old monitoring stack

                            +
                            +
                            ./kill-all.sh
                            +
                            +
                            +
                            +
                          8. +
                          9. Start the new monitoring stack

                            +
                            +
                            ./start-all.sh -d /prometheus-data-path
                            +
                            +
                            +
                            +
                          10. +
                          +
                          +
                          +

                          Validate the upgrade

                          +

                          You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                          +

                          Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                          +
                          +
                          +
                          +

                          Rollback

                          +

                          To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..6094c8a27 --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                          +
                          +

                          Upgrade Procedure

                          +

                          We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                          +

                          Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                          +
                          +

                          Install 3.y (The new version)

                          +
                          wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                          +unzip scylla-monitoring-3.y.zip
                          +cd scylla-monitoring-scylla-monitoring-3.y/
                          +
                          +
                          +

                          Replace “y” with the new minor release number, for example, 3.0.1.zip

                          +
                          +
                          +

                          Setting the server’s files

                          +

                          Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                          +
                          cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                          +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                          +
                          +
                          +
                          +
                          +

                          Validate the new version is running the correct version

                          +

                          Starting from Scylla-Monitoring version 2.2, you can run:

                          +
                          ./start-all.sh --version
                          +
                          +
                          +

                          To validate the Scylla-Monitoring version.

                          +
                          +
                          +

                          Validate the version installed correctly

                          +

                          To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                          +
                          ./start-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          Browse to http://{ip}:9091 +And check the Grafana dashboard

                          +

                          Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                          +
                          +

                          Caution

                          +

                          Important: do not use the local dir flag when testing!

                          +
                          +

                          When you are satisfied with the data in the dashboard, you can shut down the containers.

                          +
                          +

                          Caution

                          +

                          Important: Do not kill the 3.x version that is currently running.

                          +
                          +
                          +
                          +

                          Killing the new 3.y Monitoring stack in testing mode

                          +

                          Use the following command to kill the containers:

                          +
                          ./kill-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          You can start and stop the new 3.y version while testing.

                          +
                          +
                          +

                          Move to version 3.y (the new version)

                          +

                          Note: migrating will cause a few seconds of blackout in the system.

                          +

                          We assume that you are using external volume to store the metrics data.

                          +
                          +

                          Kill all containers

                          +

                          At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                          +

                          Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                          +

                          kill the older 3.x version containers by running:

                          +
                          ./kill-all.sh
                          +
                          +
                          +

                          Start version 3.y in normal mode

                          +

                          From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                          +
                          ./start-all.sh -d /path/to/data/dir
                          +
                          +
                          +

                          Point your browser to http://{ip}:3000 and see that the data is there.

                          +
                          +
                          +
                          +

                          Rollback to version 3.x

                          +

                          To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                          +

                          To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                          +
                          ./kill-all.sh
                          +cd /path/to/scylla-grafana-3.x/
                          +./start-all.sh -d /path/to/data/dir
                          +
                          +
                          +
                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..989ce3cac --- /dev/null +++ b/branch-4.3/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,939 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                          +

                          This document is a step by step procedure for upgrading Scylla Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                          +
                          +

                          Upgrade Procedure

                          +

                          We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                          +

                          Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                          +
                          +

                          Install 4.y (The new version)

                          +
                          wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                          +unzip scylla-monitoring-4.y.zip
                          +cd scylla-monitoring-scylla-monitoring-4.y/
                          +
                          +
                          +

                          Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                          +
                          +
                          +

                          Setting the server’s files

                          +

                          Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                          +
                          cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                          +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                          +
                          +
                          +
                          +
                          +

                          Validate the new version is running the correct version

                          +

                          run:

                          +
                          ./start-all.sh --version
                          +
                          +
                          +

                          To validate the Scylla-Monitoring version.

                          +
                          +
                          +
                          +

                          Running in test mode

                          +

                          This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                          +
                          +

                          Running second monitoring stack

                          +

                          We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                          +
                          ./start-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          Browse to http://{ip}:9091 and check the Grafana dashboard.

                          +

                          Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                          +
                          +

                          Caution

                          +

                          Important: do not use the local dir flag when testing!

                          +
                          +

                          When you are satisfied with the data in the dashboard, you can shut down the containers.

                          +
                          +

                          Caution

                          +

                          Important: Do not kill the 3.x version that is currently running!

                          +
                          +
                          +
                          +

                          Killing the new 4.y Monitoring stack in testing mode

                          +

                          Use the following command to kill the containers:

                          +
                          ./kill-all.sh -p 9091 -g 3001 -m 9095
                          +
                          +
                          +

                          You can start and stop the new 4.y version while testing.

                          +
                          +
                          +
                          +

                          Migrating

                          +
                          +

                          Move to version 4.y (the new version)

                          +

                          Note: migrating will cause a few seconds of blackout in the system.

                          +

                          We assume that you are using external volume to store the metrics data.

                          +
                          +

                          Backup

                          +

                          We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                          +
                          +
                          +

                          Kill all containers

                          +

                          At this point you have two monitoring stacks installed with the older version running.

                          +

                          If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                          +

                          kill the older 3.x version containers by running:

                          +
                          ./kill-all.sh
                          +
                          +
                          +

                          Start version 4.y in normal mode

                          +

                          From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                          +
                          ./start-all.sh -d /path/to/copy/data/dir
                          +
                          +
                          +

                          Point your browser to http://{ip}:3000 and see that the data is there.

                          +
                          +
                          +
                          +

                          Rollback to version 3.x

                          +

                          To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                          +

                          To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                          +
                          ./kill-all.sh
                          +cd /path/to/scylla-grafana-3.x/
                          +./start-all.sh -d /path/to/original/data/dir
                          +
                          +
                          +
                          +
                          +
                          +

                          Post-installation: Metrics back-filling

                          +

                          Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                          +

                          For example, this is a recording rule that calculates the p99 write latency:

                          +
                          - record: wlatencyp99
                          +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                          +  labels:
                          +    by: "instance,shard"
                          +
                          +
                          +

                          For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                          +

                          Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                          +
                          +
                          +

                          Note

                          +

                          If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                          +
                          +
                          +
                          +../_images/before-backfilling.png +
                          +

                          This is an example of missing latency graph

                          +
                          +
                          +

                          The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                          +

                          For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                          +

                          In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                          +

                          The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                          +
                          +

                          Determine the backfilling period

                          +

                          When you run the backfilling process you need to determine the start time and end time.

                          +
                          +

                          Determine the start time

                          +

                          The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                          +

                          If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                          +

                          For the rest of this example, we will assume that your retention time is 360 days.

                          +
                          +
                          +

                          Determine the end time

                          +

                          Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                          +

                          If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                          +

                          That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                          +

                          The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                          +
                          +
                          +
                          +

                          Backfilling Process

                          +
                          +

                          backup

                          +

                          If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                          +

                          To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                          +
                          +
                          +

                          Restart the monitoring stack

                          +

                          You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                          +

                          -b "--storage.tsdb.allow-overlapping-blocks"

                          +
                          +
                          +

                          Create the data files

                          +

                          We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                          +

                          The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                          +

                          Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                          +
                          docker exec -it aprom sh
                          +cd /prometheus/data/
                          +promtool tsdb create-blocks-from rules \
                          +--start $start \
                          +--end $end \
                          +--url http://localhost:9090 \
                          +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                          +
                          +
                          +

                          It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                          +
                          +
                          +

                          Note

                          +

                          Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                          +
                          +
                          +
                          +
                          +

                          Copy the data files

                          +

                          Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                          +

                          Copy the data files to the Prometheus directory:

                          +
                          cp data/* .
                          +
                          +
                          +

                          The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                          +

                          Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                          +
                          +../_images/after-backfilling.jpg +
                          +

                          Un example: after loading half of the data

                          +
                          +
                          +
                          +
                          +
                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.3/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..7f50fac5b --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries use ALLOW FILTERING

                          +

                          Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                          +

                          These kinds of queries can create a bigger load on Scylla, and should be used with care.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlCLAll.html b/branch-4.3/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..ef43e2a25 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries use Consistency Level: ALL

                          +

                          Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                          +

                          Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                          +

                          Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlCLAny.html b/branch-4.3/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..ab92968d9 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries use Consistency Level: ANY

                          +

                          Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                          +

                          Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.3/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..ffa292891 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries are not token-aware

                          +

                          Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                          +

                          Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlNonPaged.html b/branch-4.3/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..1a9a77cb3 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some SELECT queries are non-paged

                          +

                          By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                          +
                          +

                          Blog-post Links

                          +

                          https://www.scylladb.com/2018/07/13/efficient-query-paging/

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.3/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..4a041527e --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries are non-prepared

                          +

                          Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.3/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..23e79a859 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Some queries use reverse order

                          +

                          Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                          +

                          Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/heavyCompaction.html b/branch-4.3/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..6f08ecdd7 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Compaction takes lots of memory and CPU

                          +

                          ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                          +

                          If this is the case, you can do one of the following:

                          +
                            +
                          • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                            +
                            +
                              +
                            • In the scylla.yml configuration file: compaction_static_shares: 100

                            • +
                            • In the command line when starting ScyllaDB: --compaction-static-shares 100

                            • +
                            +
                            +

                            You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                            +
                          • +
                          • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                          • +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/index.html b/branch-4.3/use-monitoring/advisor/index.html new file mode 100644 index 000000000..218559a5c --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/index.html @@ -0,0 +1,707 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Scylla Monitoring Stack Advisor

                          +
                          +
                          +

                          The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                          +
                          +

                          The Advisor section

                          +
                          +../../_images/advisor_panel.png +
                          +

                          The Advisor section

                          +
                          +
                          +

                          The Advisor section is located on the Overview dashboard and consists of two parts:

                          +

                          On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                          +

                          For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                          +

                          On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                          +

                          For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                          +

                          Each Advisor issue is explained in detail:

                          + +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/nodeCLErrors.html b/branch-4.3/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..6526583f2 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Some operation failed due to unsatisfied consistency level

                          +

                          ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                          +

                          For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                          +

                          When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/nodeIOErrors.html b/branch-4.3/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..87d458e85 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          I/O Errors can indicate a node with a faulty disk

                          +

                          I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.3/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..a71e531b6 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Some operations failed on the replica side

                          +

                          ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                          +

                          An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.3/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..2c5f42692 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          CQL queries are not balanced among shards

                          +

                          For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                          +

                          There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                          +
                          +

                          Blog post link

                          +

                          https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.3/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..1823f5b92 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          Prepared statements cache eviction

                          +

                          Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                          +
                            +
                          • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                          • +
                          • The prepared statements cache might be too small for the number of prepared statements.

                          • +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/advisor/systemOverload.html b/branch-4.3/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..6ab8fbee4 --- /dev/null +++ b/branch-4.3/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          System Overload

                          +

                          There could be multiple indications that a system is overloaded:

                          +
                            +
                          • Timeouts

                          • +
                          • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                          • +
                          • CPU at 100% when no background process (like compaction or repair) runs.

                          • +
                          • Ques are getting filled.

                          • +
                          +

                          If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/cql_optimization.html b/branch-4.3/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..c2cc6e536 --- /dev/null +++ b/branch-4.3/use-monitoring/cql_optimization.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + + + +
                          +

                          The CQL Optimization

                          +

                          The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                          +
                          +../_images/cql_optimization_master.png +
                          +

                          The CQL Dashboard

                          +
                          +
                          +

                          The upper part of the dashboard holds CQL related metrics.

                          +

                          The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                          +
                          +

                          Note

                          +

                          Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                          +
                          +

                          The following sections describe each of the dashboard’s panel

                          +
                          +

                          Prepared Statements

                          +

                          Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                          +

                          Using prepared statements has the following benefits:

                          +
                            +
                          • The database only needs to parse the query once

                          • +
                          • The driver can route the query to the right node

                          • +
                          • Using place-holders and values is safer and prevents CQL-Injection

                          • +
                          +

                          The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                          +

                          The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                          +
                          +
                          +

                          Token Aware

                          +

                          Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                          +

                          Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                          +

                          The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                          +

                          The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                          +
                          +
                          +

                          Paged Queries

                          +

                          By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                          +

                          The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                          +

                          The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                          +
                          +
                          +

                          Reversed CQL Reads

                          +

                          Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                          +

                          Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                          +

                          For example, look at the following table:

                          +
                          CREATE TABLE ks1.table_demo (
                          +   category text,
                          +   type int,
                          +   PRIMARY KEY (category, type))
                          +WITH CLUSTERING ORDER BY (type DESC);
                          +
                          +
                          +

                          The following query uses reverse order:

                          +
                          select * from ks1.table_demo where category='cat1' order by type ASC;
                          +
                          +
                          +

                          The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                          +

                          The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                          +
                          +
                          +

                          ALLOW FILTERING

                          +

                          Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                          +

                          These kinds of queries can create a big load on the system, and should be used with care.

                          +

                          The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                          +

                          The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                          +

                          The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                          +

                          The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                          +

                          The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                          +
                          +
                          +

                          Consistency Level

                          +

                          Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                          +

                          The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                          +

                          Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                          +

                          The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                          +

                          The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                          +

                          The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                          +

                          The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                          +
                          +
                          +

                          Cross DC

                          +

                          Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                          +
                          +
                          +

                          Cross DC Consistency Level

                          +

                          Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                          +
                          +
                          +

                          Cross DC read requests

                          +
                          +

                          Note

                          +

                          The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                          +
                          +

                          In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                          +

                          The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                          +
                          +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.3/use-monitoring/index.html b/branch-4.3/use-monitoring/index.html new file mode 100644 index 000000000..7588f9bb9 --- /dev/null +++ b/branch-4.3/use-monitoring/index.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                          + + + +
                          +
                          + Menu +
                          +
                          +
                          +
                          +
                          + + +
                          +

                          Caution

                          +

                          + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                          +
                          + + + +
                          + +
                          + +
                          +

                          Using Scylla Monitoring Stack

                          +
                          +
                          +

                          There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                          + +
                          + + +
                          + + + + + + + +
                          + +
                          + + + + +
                          + + + + + + + \ No newline at end of file diff --git a/branch-4.4/.buildinfo b/branch-4.4/.buildinfo new file mode 100644 index 000000000..b798f2fa5 --- /dev/null +++ b/branch-4.4/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 31c4a8d5b579f2b025807ac4500936fc +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.4/.doctrees/common/monitor-description.doctree b/branch-4.4/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..839e3ca95 Binary files /dev/null and b/branch-4.4/.doctrees/common/monitor-description.doctree differ diff --git a/branch-4.4/.doctrees/environment.pickle b/branch-4.4/.doctrees/environment.pickle new file mode 100644 index 000000000..969eb7e79 Binary files /dev/null and b/branch-4.4/.doctrees/environment.pickle differ diff --git a/branch-4.4/.doctrees/index.doctree b/branch-4.4/.doctrees/index.doctree new file mode 100644 index 000000000..6736d5146 Binary files /dev/null and b/branch-4.4/.doctrees/index.doctree differ diff --git a/branch-4.4/.doctrees/install/docker-compose.doctree b/branch-4.4/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..ba5f893e8 Binary files /dev/null and b/branch-4.4/.doctrees/install/docker-compose.doctree differ diff --git a/branch-4.4/.doctrees/install/index.doctree b/branch-4.4/.doctrees/install/index.doctree new file mode 100644 index 000000000..9d464000d Binary files /dev/null and b/branch-4.4/.doctrees/install/index.doctree differ diff --git a/branch-4.4/.doctrees/install/min-prod-hw.doctree b/branch-4.4/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..75efd2a56 Binary files /dev/null and b/branch-4.4/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.4/.doctrees/install/monitor-without-docker.doctree b/branch-4.4/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..d016cb48f Binary files /dev/null and b/branch-4.4/.doctrees/install/monitor-without-docker.doctree differ diff --git a/branch-4.4/.doctrees/install/monitoring-stack.doctree b/branch-4.4/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..fcdcece5b Binary files /dev/null and b/branch-4.4/.doctrees/install/monitoring-stack.doctree differ diff --git a/branch-4.4/.doctrees/install/start-all.doctree b/branch-4.4/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..74a3ea4f9 Binary files /dev/null and b/branch-4.4/.doctrees/install/start-all.doctree differ diff --git a/branch-4.4/.doctrees/install/thanos.doctree b/branch-4.4/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..67fb47f58 Binary files /dev/null and b/branch-4.4/.doctrees/install/thanos.doctree differ diff --git a/branch-4.4/.doctrees/intro.doctree b/branch-4.4/.doctrees/intro.doctree new file mode 100644 index 000000000..06bdb6c0b Binary files /dev/null and b/branch-4.4/.doctrees/intro.doctree differ diff --git a/branch-4.4/.doctrees/procedures/alerts/alerting.doctree b/branch-4.4/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..cdff98974 Binary files /dev/null and b/branch-4.4/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.4/.doctrees/procedures/alerts/index.doctree b/branch-4.4/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..16d2c5b2a Binary files /dev/null and b/branch-4.4/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.4/.doctrees/procedures/datadog/index.doctree b/branch-4.4/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..7006c77c8 Binary files /dev/null and b/branch-4.4/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.4/.doctrees/procedures/index.doctree b/branch-4.4/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..eae9aec0c Binary files /dev/null and b/branch-4.4/.doctrees/procedures/index.doctree differ diff --git a/branch-4.4/.doctrees/procedures/updating-dashboard.doctree b/branch-4.4/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..7a5be6694 Binary files /dev/null and b/branch-4.4/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/branch-4.4/.doctrees/reference/index.doctree b/branch-4.4/.doctrees/reference/index.doctree new file mode 100644 index 000000000..81ea80b03 Binary files /dev/null and b/branch-4.4/.doctrees/reference/index.doctree differ diff --git a/branch-4.4/.doctrees/reference/matrix.doctree b/branch-4.4/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..e29e9bd19 Binary files /dev/null and b/branch-4.4/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.4/.doctrees/reference/monitoring-apis.doctree b/branch-4.4/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..d2ee0d26c Binary files /dev/null and b/branch-4.4/.doctrees/reference/monitoring-apis.doctree differ diff --git a/branch-4.4/.doctrees/troubleshooting/index.doctree b/branch-4.4/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..988ab398b Binary files /dev/null and b/branch-4.4/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.4/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/branch-4.4/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..5e8040001 Binary files /dev/null and b/branch-4.4/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/index.doctree b/branch-4.4/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..85215152e Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..0ccf1de71 Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..00b59083d Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..f184e1cfa Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..4d6f4d7d3 Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..ae4e199e9 Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..add368d28 Binary files /dev/null and b/branch-4.4/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..e7726c4a1 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..1d6bc175d Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..d5fd0e2c9 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..89e38db28 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..ab4ea8c11 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..8077521f7 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree new file mode 100644 index 000000000..34f4b7ae8 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/cqlReverseOrder.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..0f91d6f34 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..fd3d5ecd3 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..f5689d0d1 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..81b63a7ff Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..61a2f1346 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..553e6f162 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..15aa72d70 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.4/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..fc623a08b Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/cql-optimization.doctree b/branch-4.4/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..e0547ac5d Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/branch-4.4/.doctrees/use-monitoring/index.doctree b/branch-4.4/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..6e17cc360 Binary files /dev/null and b/branch-4.4/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.4/.nojekyll b/branch-4.4/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.4/404.html b/branch-4.4/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.4/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                          +

                          404

                          +

                          The ScyllaDB monster ate your page!

                          +

                          + Home +

                          +
                          + + + \ No newline at end of file diff --git a/branch-4.4/CNAME b/branch-4.4/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.4/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.4/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.4/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..3e85b60ab --- /dev/null +++ b/branch-4.4/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,576 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" diff --git a/branch-4.4/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.4/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.4/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.4/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.4/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/branch-4.4/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.4/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.4/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/branch-4.4/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.4/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/branch-4.4/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/branch-4.4/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/branch-4.4/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.4/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/branch-4.4/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.4/_images/1.png b/branch-4.4/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.4/_images/1.png differ diff --git a/branch-4.4/_images/2.png b/branch-4.4/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.4/_images/2.png differ diff --git a/branch-4.4/_images/3.png b/branch-4.4/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.4/_images/3.png differ diff --git a/branch-4.4/_images/advisor_panel.png b/branch-4.4/_images/advisor_panel.png new file mode 100644 index 000000000..89905191a Binary files /dev/null and b/branch-4.4/_images/advisor_panel.png differ diff --git a/branch-4.4/_images/after-backfilling.jpg b/branch-4.4/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.4/_images/after-backfilling.jpg differ diff --git a/branch-4.4/_images/alertmanager.png b/branch-4.4/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.4/_images/alertmanager.png differ diff --git a/branch-4.4/_images/before-backfilling.png b/branch-4.4/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.4/_images/before-backfilling.png differ diff --git a/branch-4.4/_images/cql_optimization_master.png b/branch-4.4/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.4/_images/cql_optimization_master.png differ diff --git a/branch-4.4/_images/datadog.png b/branch-4.4/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.4/_images/datadog.png differ diff --git a/branch-4.4/_images/grafana.png b/branch-4.4/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.4/_images/grafana.png differ diff --git a/branch-4.4/_images/monitor.png b/branch-4.4/_images/monitor.png new file mode 100644 index 000000000..562b26efe Binary files /dev/null and b/branch-4.4/_images/monitor.png differ diff --git a/branch-4.4/_images/monitoring_stack.png b/branch-4.4/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.4/_images/monitoring_stack.png differ diff --git a/branch-4.4/_images/monitoring_stack1.png b/branch-4.4/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.4/_images/monitoring_stack1.png differ diff --git a/branch-4.4/_sources/common/monitor-description.rst.txt b/branch-4.4/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.4/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.4/_sources/index.rst.txt b/branch-4.4/_sources/index.rst.txt new file mode 100644 index 000000000..1d8a0d691 --- /dev/null +++ b/branch-4.4/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on Scylla University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.4/_sources/install/docker-compose.rst.txt b/branch-4.4/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.4/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.4/_sources/install/index.rst.txt b/branch-4.4/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/branch-4.4/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.4/_sources/install/min-prod-hw.rst.txt b/branch-4.4/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.4/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                          + + + + + + + + + + + +
                          # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                          00
                          + +
                          + \ No newline at end of file diff --git a/branch-4.4/_sources/install/monitor-without-docker.rst.txt b/branch-4.4/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..d0be59164 --- /dev/null +++ b/branch-4.4/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                          `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.4/_sources/install/monitoring-stack.rst.txt b/branch-4.4/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..911295768 --- /dev/null +++ b/branch-4.4/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,409 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                          `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.5 + - 2.45.0 + - 10.0.2 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.4/_sources/install/start-all.rst.txt b/branch-4.4/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..4407b5495 --- /dev/null +++ b/branch-4.4/_sources/install/start-all.rst.txt @@ -0,0 +1,105 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.4/_sources/install/thanos.rst.txt b/branch-4.4/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.4/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.4/_sources/intro.rst.txt b/branch-4.4/_sources/intro.rst.txt new file mode 100644 index 000000000..ed1a30320 --- /dev/null +++ b/branch-4.4/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.4/_sources/procedures/alerts/alerting.rst.txt b/branch-4.4/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.4/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.4/_sources/procedures/alerts/index.rst.txt b/branch-4.4/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.4/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.4/_sources/procedures/datadog/index.rst.txt b/branch-4.4/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bcc4e9b7 --- /dev/null +++ b/branch-4.4/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,68 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non Scylla Cloud users, download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Cloud users, skip this step, it's been take care for by the cloud. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.4/_sources/procedures/index.rst.txt b/branch-4.4/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..76a24002a --- /dev/null +++ b/branch-4.4/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.4/_sources/procedures/updating-dashboard.rst.txt b/branch-4.4/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.4/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.4/_sources/reference/index.rst.txt b/branch-4.4/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/branch-4.4/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.4/_sources/reference/matrix.rst.txt b/branch-4.4/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..23cb1efa2 --- /dev/null +++ b/branch-4.4/_sources/reference/matrix.rst.txt @@ -0,0 +1,155 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.4/_sources/reference/monitoring-apis.rst.txt b/branch-4.4/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/branch-4.4/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.4/_sources/troubleshooting/index.rst.txt b/branch-4.4/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..464ef0020 --- /dev/null +++ b/branch-4.4/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,15 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ \ No newline at end of file diff --git a/branch-4.4/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/branch-4.4/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/branch-4.4/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.4/_sources/upgrade/index.rst.txt b/branch-4.4/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/branch-4.4/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                          +
                          +
                          +
                          Upgrade Scylla Open Source
                          +
                          +
                          + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                          +
                          +
                          diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..71dbb9dbc --- /dev/null +++ b/branch-4.4/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,138 @@ +================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y +================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x to 4.y, for example, between 4.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x version that is currently running. + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x after you completed the moving to version 4.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..fe584a7c2 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,7 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.4/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt new file mode 100644 index 000000000..45a3e0245 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/cqlReverseOrder.rst.txt @@ -0,0 +1,10 @@ +Some queries use reverse order +------------------------------ + +Scylla supports a “cluster key” as a way to order (sort) rows in the same partition. + +Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible + +Documentation link +^^^^^^^^^^^^^^^^^^ +https://docs.scylladb.com/troubleshooting/reverse-queries/ diff --git a/branch-4.4/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.4/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..d521dafc5 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,44 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and consists of two parts: + +On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem. + +For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some queries use reverse order ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.4/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.4/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.4/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.4/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.4/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.4/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.4/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.4/_sources/use-monitoring/cql-optimization.rst.txt b/branch-4.4/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..f451ecf64 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,153 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is inefficient and should be avoided. + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.4/_sources/use-monitoring/index.rst.txt b/branch-4.4/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/branch-4.4/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.4/_static/basic.css b/branch-4.4/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.4/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.4/_static/check-solid.svg b/branch-4.4/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.4/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.4/_static/clipboard.min.js b/branch-4.4/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.4/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.4/_static/copybutton.css b/branch-4.4/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.4/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                          Short

                          + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.4/_static/copybutton.js b/branch-4.4/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.4/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.4/_static/copybutton_funcs.js b/branch-4.4/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.4/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.4/_static/css/main.css b/branch-4.4/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-4.4/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.4/_static/doctools.js b/branch-4.4/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.4/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.4/_static/documentation_options.js b/branch-4.4/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.4/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.4/_static/file.png b/branch-4.4/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.4/_static/file.png differ diff --git a/branch-4.4/_static/img/banner-background.svg b/branch-4.4/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.4/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.4/_static/img/favicon-228x228.png b/branch-4.4/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.4/_static/img/favicon-228x228.png differ diff --git a/branch-4.4/_static/img/favicon-32x32.png b/branch-4.4/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.4/_static/img/favicon-32x32.png differ diff --git a/branch-4.4/_static/img/favicon.ico b/branch-4.4/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.4/_static/img/favicon.ico differ diff --git a/branch-4.4/_static/img/icons/icon-about-team.svg b/branch-4.4/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.4/_static/img/icons/icon-about-us-m.svg b/branch-4.4/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-about-us.svg b/branch-4.4/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-alternator.svg b/branch-4.4/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-apps.svg b/branch-4.4/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-architecture.svg b/branch-4.4/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.4/_static/img/icons/icon-benchmarks.svg b/branch-4.4/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.4/_static/img/icons/icon-blog.svg b/branch-4.4/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.4/_static/img/icons/icon-careers.svg b/branch-4.4/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.4/_static/img/icons/icon-chevron-left.svg b/branch-4.4/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.4/_static/img/icons/icon-chevron-right.svg b/branch-4.4/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.4/_static/img/icons/icon-circe.svg b/branch-4.4/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-clock.svg b/branch-4.4/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-close.svg b/branch-4.4/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-cloud-docs.svg b/branch-4.4/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-cloud.svg b/branch-4.4/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-comparison.svg b/branch-4.4/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.4/_static/img/icons/icon-contact-us.svg b/branch-4.4/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.4/_static/img/icons/icon-developers-blog.svg b/branch-4.4/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.4/_static/img/icons/icon-docs.svg b/branch-4.4/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.4/_static/img/icons/icon-enterprise-m.svg b/branch-4.4/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-enterprise.svg b/branch-4.4/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-events.svg b/branch-4.4/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.4/_static/img/icons/icon-exclamation.svg b/branch-4.4/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-expand.svg b/branch-4.4/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-forum.svg b/branch-4.4/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-getting-started.svg b/branch-4.4/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-glossary.svg b/branch-4.4/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-home.svg b/branch-4.4/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-infoworld.svg b/branch-4.4/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.4/_static/img/icons/icon-integrations.svg b/branch-4.4/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-knowledge-base.svg b/branch-4.4/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-less.svg b/branch-4.4/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-live-test.svg b/branch-4.4/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.4/_static/img/icons/icon-mail-list.svg b/branch-4.4/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-manager.svg b/branch-4.4/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.4/_static/img/icons/icon-memory-management.svg b/branch-4.4/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.4/_static/img/icons/icon-modeling.svg b/branch-4.4/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-monitoring.svg b/branch-4.4/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.4/_static/img/icons/icon-networking.svg b/branch-4.4/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.4/_static/img/icons/icon-news.svg b/branch-4.4/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.4/_static/img/icons/icon-newsletter.svg b/branch-4.4/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.4/_static/img/icons/icon-nsql-guides.svg b/branch-4.4/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.4/_static/img/icons/icon-open-source.svg b/branch-4.4/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.4/_static/img/icons/icon-operator.svg b/branch-4.4/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-overview.svg b/branch-4.4/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.4/_static/img/icons/icon-partners.svg b/branch-4.4/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.4/_static/img/icons/icon-plus.svg b/branch-4.4/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-pricing.svg b/branch-4.4/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.4/_static/img/icons/icon-release-notes.svg b/branch-4.4/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.4/_static/img/icons/icon-resource-center.svg b/branch-4.4/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.4/_static/img/icons/icon-roadmap.svg b/branch-4.4/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.4/_static/img/icons/icon-search.svg b/branch-4.4/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.4/_static/img/icons/icon-slack.svg b/branch-4.4/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-stack-overflow.svg b/branch-4.4/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.4/_static/img/icons/icon-summit.svg b/branch-4.4/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/icons/icon-support.svg b/branch-4.4/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.4/_static/img/icons/icon-tech-talks.svg b/branch-4.4/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.4/_static/img/icons/icon-testing.svg b/branch-4.4/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.4/_static/img/icons/icon-thumbs-down.svg b/branch-4.4/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-thumbs-up.svg b/branch-4.4/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.4/_static/img/icons/icon-tip.svg b/branch-4.4/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.4/_static/img/icons/icon-training.svg b/branch-4.4/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.4/_static/img/icons/icon-triangle-down.svg b/branch-4.4/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.4/_static/img/icons/icon-university.svg b/branch-4.4/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.4/_static/img/icons/icon-users-blog.svg b/branch-4.4/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.4/_static/img/icons/icon-warning.svg b/branch-4.4/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.4/_static/img/icons/icon-webinars.svg b/branch-4.4/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.4/_static/img/icons/icon-whitepapers.svg b/branch-4.4/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.4/_static/img/icons/icon-workshop.svg b/branch-4.4/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.4/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.4/_static/img/logo-docs.svg b/branch-4.4/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.4/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.4/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.4/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.4/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.4/_static/img/mascots/404.jpg b/branch-4.4/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.4/_static/img/mascots/404.jpg differ diff --git a/branch-4.4/_static/img/mascots/scylla-3monsters.png b/branch-4.4/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.4/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-alternator.svg b/branch-4.4/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.4/_static/img/mascots/scylla-cloud.svg b/branch-4.4/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.4/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.4/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-computer-headset.png b/branch-4.4/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-cup-number-one.png b/branch-4.4/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-docs.svg b/branch-4.4/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.4/_static/img/mascots/scylla-drivers.svg b/branch-4.4/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.4/_static/img/mascots/scylla-enterprise.svg b/branch-4.4/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.4/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.4/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-forklift-migration.png b/branch-4.4/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-gear.png b/branch-4.4/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-hardhat.png b/branch-4.4/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-headband.png b/branch-4.4/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-headset.png b/branch-4.4/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-hearts.png b/branch-4.4/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-looking-down.png b/branch-4.4/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-looking-up.png b/branch-4.4/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.4/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.4/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-manager.svg b/branch-4.4/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.4/_static/img/mascots/scylla-monitor.svg b/branch-4.4/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.4/_static/img/mascots/scylla-movement-fast.png b/branch-4.4/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-movement.png b/branch-4.4/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-onpremise.png b/branch-4.4/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-opensource.svg b/branch-4.4/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.4/_static/img/mascots/scylla-operator.svg b/branch-4.4/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.4/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.4/_static/img/mascots/scylla-plugin.png b/branch-4.4/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-release-mascot.png b/branch-4.4/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-repair.png b/branch-4.4/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-server.png b/branch-4.4/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-sleeping.png b/branch-4.4/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-tall-measure.png b/branch-4.4/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-university.png b/branch-4.4/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-weights.png b/branch-4.4/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-window-cleaning.png b/branch-4.4/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-with-computer-2.png b/branch-4.4/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-with-computer.png b/branch-4.4/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-with-linux.png b/branch-4.4/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.4/_static/img/mascots/scylla-writting.png b/branch-4.4/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.4/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.4/_static/img/menu.svg b/branch-4.4/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.4/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.4/_static/img/scylla-monitor.png b/branch-4.4/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.4/_static/img/scylla-monitor.png differ diff --git a/branch-4.4/_static/js/main.bundle.js b/branch-4.4/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-4.4/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                        • Back
                        • ',backButtonPosition:"top",wrapper:"
                          ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                            "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                            ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                            ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                            ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                            ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                            "],col:[2,"","
                            "],tr:[2,"","
                            "],td:[3,"","
                            "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +

                            ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                            + + +
                            + + + + + +
                            + + +
                            + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/genindex.html b/branch-4.4/genindex.html new file mode 100644 index 000000000..fe1ebd0c1 --- /dev/null +++ b/branch-4.4/genindex.html @@ -0,0 +1,642 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + + + +
                            + + + + + +
                            + + +
                            + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/index.html b/branch-4.4/index.html new file mode 100644 index 000000000..0f29c221b --- /dev/null +++ b/branch-4.4/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            ScyllaDB Monitoring Stack

                            +
                            +
                            +

                            ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                            +_images/monitor.png +

                            The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                            +
                              +
                            • prometheus - collects and stores metrics

                            • +
                            • alertmanager - handles alerts

                            • +
                            • grafana - dashboard server

                            • +
                            +

                            Choose a topic to get started:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/docker-compose.html b/branch-4.4/install/docker-compose.html new file mode 100644 index 000000000..4f92cefbd --- /dev/null +++ b/branch-4.4/install/docker-compose.html @@ -0,0 +1,814 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Using Docker Compose

                            +

                            Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                            +

                            Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                            +
                            +

                            Warning

                            +

                            docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                            +
                            +
                            +

                            Prerequisite

                            +

                            Make sure you have docker and docker-compose installed.

                            +
                            +
                            +

                            Setting Prometheus

                            +

                            The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                            +

                            You can use ./prometheus-config.sh to generate the file, for example:

                            +
                            ./prometheus-config.sh --compose
                            +
                            +
                            +

                            For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                            +
                            +
                            +

                            Setting Grafana Provisioning

                            +

                            Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                            +
                            +

                            Grafana Data-Source file

                            +

                            Run the following command to update the datasource:

                            +
                            ./grafana-datasource.sh --compose
                            +
                            +
                            +

                            You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                            +
                            +
                            +

                            Grafana Dashboard Load file

                            +

                            To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                            +
                            ./generate-dashboards.sh -t -v 2020.1
                            +
                            +
                            +

                            This command generates the files under: grafana/provisioning/dashboards/

                            +
                            +
                            +
                            +

                            Docker Compose file

                            +

                            You can use the following example as a base for your docker compose.

                            +

                            Pass the following to a file called docker-compose.yml

                            +
                            services:
                            +  alertmanager:
                            +    container_name: aalert
                            +    image: prom/alertmanager:v0.24.0
                            +    ports:
                            +    - 9093:9093
                            +    volumes:
                            +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                            +  grafana:
                            +    container_name: agraf
                            +    environment:
                            +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                            +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                            +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                            +    # This is where you set Grafana security
                            +    - GF_AUTH_BASIC_ENABLED=false
                            +    - GF_AUTH_ANONYMOUS_ENABLED=true
                            +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                            +    - GF_SECURITY_ADMIN_PASSWORD=admin
                            +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                            +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                            +    image: grafana/grafana:9.3.11
                            +    ports:
                            +    - 3000:3000
                            +    user: 1000:1000
                            +    volumes:
                            +    - ./grafana/build:/var/lib/grafana/dashboards
                            +    - ./grafana/plugins:/var/lib/grafana/plugins
                            +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                            +    # Uncomment the following line for grafana persistency
                            +    # - path/to/grafana/dir:/var/lib/grafana
                            +  loki:
                            +    command:
                            +    - --config.file=/mnt/config/loki-config.yaml
                            +    container_name: loki
                            +    image: grafana/loki:2.7.3
                            +    ports:
                            +    - 3100:3100
                            +    volumes:
                            +    - ./loki/rules:/etc/loki/rules
                            +    - ./loki/conf:/mnt/config
                            +  promotheus:
                            +    command:
                            +    - --config.file=/etc/prometheus/prometheus.yml
                            +    container_name: aprom
                            +    image: prom/prometheus:v2.42.0
                            +    ports:
                            +    - 9090:9090
                            +    volumes:
                            +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                            +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                            +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                            +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                            +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                            +    # Uncomment the following line for prometheus persistency 
                            +    # - path/to/data/dir:/prometheus/data
                            +  promtail:
                            +    command:
                            +    - --config.file=/etc/promtail/config.yml
                            +    container_name: promtail
                            +    image: grafana/promtail:2.7.3
                            +    ports:
                            +    - 1514:1514
                            +    - 9080:9080
                            +    volumes:
                            +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                            +version: '3'
                            +
                            +
                            +
                            +

                            Start and Stop

                            +

                            To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/index.html b/branch-4.4/install/index.html new file mode 100644 index 000000000..b3c434b13 --- /dev/null +++ b/branch-4.4/install/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Download and Install Scylla Monitoring Stack

                            +
                            +
                            +

                            Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                            +

                            Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/min-prod-hw.html b/branch-4.4/install/min-prod-hw.html new file mode 100644 index 000000000..cf722c402 --- /dev/null +++ b/branch-4.4/install/min-prod-hw.html @@ -0,0 +1,741 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Minimal Production System Recommendations

                            +
                              +
                            • CPU - at least 2 physical cores/ 4vCPUs

                            • +
                            • Memory - 15GB+ DRAM and proportional to the number of cores.

                            • +
                            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                            • +
                            • Network - 1GbE/10GbE preferred

                            • +
                            +
                            +

                            Calculating Prometheus Minimal Disk Space requirement

                            +

                            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                            +

                            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                            +

                            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                            +
                            6 * 16 * 15 * 12MB ~ 16GB
                            +
                            +
                            +

                            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                            +
                            +
                            +

                            Calculating Prometheus Minimal Memory Space requirement

                            +

                            Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                            +

                            For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                            + +
                            + +++++++ + + + +
                            # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                            00
                            + +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/monitor-without-docker.html b/branch-4.4/install/monitor-without-docker.html new file mode 100644 index 000000000..2ace139f9 --- /dev/null +++ b/branch-4.4/install/monitor-without-docker.html @@ -0,0 +1,1157 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Deploying Scylla Monitoring Stack Without Docker

                            +
                            +

                            Introduction

                            +

                            The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                            +

                            Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                            +

                            Scylla Monitoring uses the following components:

                            +
                              +
                            • Alertmanager

                            • +
                            • Grafana Loki

                            • +
                            • Prometheus

                            • +
                            • Grafana

                            • +
                            +

                            The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                            +

                            We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                            +
                            +
                            +

                            Minimal Production System Recommendations

                            +
                              +
                            • CPU - at least 2 physical cores/ 4vCPUs

                            • +
                            • Memory - 15GB+ DRAM and proportional to the number of cores.

                            • +
                            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                            • +
                            • Network - 1GbE/10GbE preferred

                            • +
                            +
                            +

                            Calculating Prometheus Minimal Disk Space requirement

                            +

                            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                            +

                            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                            +

                            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                            +
                            6 * 16 * 15 * 12MB ~ 16GB
                            +
                            +
                            +

                            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                            +
                            +
                            +

                            Calculating Prometheus Minimal Memory Space requirement

                            +

                            Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                            +

                            For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                            + +
                            + +++++++ + + + +
                            # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                            00
                            + +
                            +

                            The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                            +
                            +

                            Note

                            +

                            Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                            +
                            +
                            +
                            +
                            +

                            Install Scylla Monitoring Stack

                            +

                            The following procedure uses a CentOS 7 based instance

                            +
                              +
                            1. Download the latest Scylla Monitoring Stack release.

                            2. +
                            +
                            wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.4.5.tar.gz
                            +
                            +
                            +
                              +
                            1. Open the tar

                            2. +
                            +

                            tar -xvf scylla-monitoring-*.tar.gz

                            +
                            +
                            +

                            Install Alertmanager

                            +

                            Tested with alertmanager 0.22.2 version

                            +
                              +
                            1. Install alertmanager

                            2. +
                            +
                            wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                            +tar -xvf alertmanager-*.linux-amd64.tar.gz
                            +
                            +
                            +
                              +
                            1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                            2. +
                            +

                            For example:

                            +
                            cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.4.5/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                            +
                            +
                            +
                              +
                            1. Start the Alertmanager

                            2. +
                            +

                            For example:

                            +
                            cd alertmanager-0.22.2.linux-amd64
                            +./alertmanager
                            +
                            +
                            +
                              +
                            1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                            2. +
                            +

                            For example:

                            +
                            http://192.168.135.166:9093/
                            +
                            +
                            +../_images/alertmanager.png +
                            +
                            +

                            Install Grafana Loki

                            +

                            Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                            +

                            We recomand using Loki with containers, but you can install it locally as described in Loki installation

                            +

                            You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                            +

                            Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                            +

                            Loki Related files

                            +

                            Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                            +
                            mkdir -p /etc/loki/rules
                            +mkdir -p /etc/loki/config
                            +cp loki/rules/* /etc/loki/rules
                            +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                            +
                            +
                            +

                            Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                            +

                            Promtail Related files

                            +

                            Promtail has a configuration file. You need to copy and modify the configuration.

                            +
                            mkdir -p /etc/promtail/
                            +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                            +
                            +
                            +

                            Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                            +
                            +
                            +

                            Install Prometheus

                            +

                            Tested with Prometheus version 2.27.1

                            +
                            +

                            Note

                            +

                            If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                            +
                            +
                              +
                            1. Install Prometheus

                            2. +
                            +
                            wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                            +tar -xvf prometheus-*.linux-amd64.tar.gz
                            +
                            +
                            +

                            2. Create Data and Config directories +.. code-block:: shell

                            +
                            +

                            mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                            +
                            +
                              +
                            1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                            2. +
                            +

                            Copy prometheus/prometheus.yml.template to prometheus.yml

                            +

                            For example:

                            +
                            cp scylla-monitoring-scylla-monitoring-4.4.5/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                            +cp scylla-monitoring-scylla-monitoring-4.4.5/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                            +
                            +
                            +
                              +
                            1. Edit the prometheus.yml file to point to the correct static data sources.

                            2. +
                            +
                            +

                            Note

                            +

                            Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                            +
                            +
                            vi /etc/prometheus/prometheus.yml
                            +
                            +
                            +

                            Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                            +

                            For example if the alertmanager will run on the same host:

                            +
                            alerting:
                            +   alertmanagers:
                            +   - static_configs:
                            +       - targets:
                            +           - 127.0.0.1:9093
                            +
                            +
                            +

                            Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                            +

                            For example the scrape config for Scylla:

                            +
                            global:
                            +  scrape_interval: 5s # By default, scrape targets every 5 second.
                            +  scrape_timeout: 4s # Timeout before trying to scape a target again
                            +
                            +  # Attach these labels to any time series or alerts when communicating with
                            +  # external systems (federation, remote storage, Alertmanager).
                            +  external_labels:
                            +    monitor: 'scylla-monitor'
                            +
                            +scrape_configs:
                            +- job_name: scylla
                            +  honor_labels: false
                            +  file_sd_configs:
                            +    - files:
                            +      - /etc/scylla.d/prometheus/scylla_servers.yml
                            +  relabel_configs:
                            +    - source_labels: [__address__]
                            +      regex:  '([^:]+)'
                            +      target_label: __address__
                            +      replacement: '${1}:9180'
                            +
                            +    - source_labels: [__address__]
                            +      regex:  '(.*):.+'
                            +      target_label: instance
                            +      replacement: '${1}'
                            +
                            +
                            +
                              +
                            1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                            2. +
                            +
                            +

                            Note

                            +

                            There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                            +
                            +

                            An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                            +
                            +

                            Note

                            +

                            You must have both files even if you are not using Scylla Manager

                            +
                            +

                            Add the labels for the cluster and data-center

                            +

                            scylla_servers.yml:

                            +

                            For example:

                            +
                            cat scylla_servers.yml
                            +# List Scylla end points
                            +
                            +- targets:
                            +  - 192.168.66.6
                            +  - 192.168.66.244
                            +  labels:
                            +    cluster: cluster1
                            +    dc: dc1
                            +- targets:
                            +    - 172.17.0.3
                            +  labels:
                            +    cluster: cluster1
                            +    dc: dc2
                            +
                            +
                            +
                            +

                            Note

                            +

                            See the previous note about deprecating the node_exporter_servers.yml file.

                            +
                            +

                            scylla_manager_server.yml

                            +

                            For example:

                            +
                            - targets:
                            +  - 127.0.0.1:5090
                            +
                            +
                            +
                              +
                            1. Start Prometheus server:

                            2. +
                            +

                            For example:

                            +
                            cd scylla-monitoring-scylla-monitoring-4.4.5/
                            +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                            +
                            +
                            +

                            Data should start accumulate on: /prometheus/data

                            +
                              +
                            1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                            2. +
                            +

                            For example:

                            +
                            http://192.168.135.166:9090/
                            +
                            +
                            +../_images/1.png +

                            Prometheus console should be visible

                            +
                              +
                            1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                            2. +
                            +

                            For example:

                            +

                            node_memory_MemFree

                            +../_images/2.png +

                            And

                            +

                            scylla_reactor_utilization

                            +../_images/3.png +

                            At this point Scylla is emitting the metrics and Prometheus is able to store them.

                            +
                            +
                            +

                            Install Grafana

                            +

                            Tested with Grafna 7.5.7

                            +
                              +
                            1. Install Grafana based on the instructions here

                            2. +
                            +

                            Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                            +
                              +
                            1. Access Scylla-Grafana-monitoring directory

                            2. +
                            +
                            cd scylla-monitoring-scylla-monitoring-4.4.5/
                            +
                            +
                            +
                              +
                            1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                            2. +
                            +
                            sudo cp -r grafana/plugins /var/lib/grafana/
                            +
                            +
                            +

                            If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                            +

                            For example:

                            +
                            cp -r grafana/plugins ../grafana-7.5.7/public/app
                            +
                            +
                            +
                              +
                            1. Provision the Dashboards

                            2. +
                            +

                            For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                            +

                            For Grafana installed with yum install

                            +
                            sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                            +sudo mkdir -p /var/lib/grafana/dashboards
                            +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                            +
                            +
                            +

                            For Grafana installed from packages

                            +
                            cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                            +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                            +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                            +
                            +
                            +

                            Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                            +
                            +

                            Note

                            +

                            A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                            +
                            +
                              +
                            1. Set the data source by copy datasource.yml and edit it

                            2. +
                            +
                            sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                            +
                            +
                            +
                            +

                            Note

                            +

                            Scylla uses a plugin to read from some system tables see the section below about using it.

                            +
                            +

                            For Grafana installed from packages

                            +
                            cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                            +
                            +
                            +

                            You should set the Prometheus and the alertmanager IP and port.

                            +

                            For example

                            +
                            sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                            +apiVersion: 1
                            +datasources:
                            + - name: prometheus
                            +   type: prometheus
                            +   url: http://192.168.135.167:9090
                            +   access: proxy
                            +   basicAuth: false
                            +
                            + - name: alertmanager
                            +   type: camptocamp-prometheus-alertmanager-datasource
                            +   orgId: 1
                            +   typeLogoUrl: public/img/icn-datasource.svg
                            +   access: proxy
                            +   url: http://192.168.135.166:9093
                            +   password:
                            +   user:
                            +   database:
                            +   basicAuth:
                            +   isDefault:
                            +   jsonData:
                            +     severity_critical: '4'
                            +     severity_high: '3'
                            +     severity_warning: '2'
                            +     severity_info: '1'
                            +
                            +
                            +
                              +
                            1. Start the Grafana service

                            2. +
                            +

                            For Grafana installed with yum install

                            +

                            sudo service grafana-server start

                            +

                            For Grafana installed from packages:

                            +

                            cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                            +

                            Edit scylla.ini to reflect the right paths in the paths section of the file.

                            +
                            plugins = /home/centos/grafana-7.5.7/data/plugins
                            +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                            +
                            +
                            +

                            Start the server:

                            +
                            cd /home/centos/grafana-7.5.7/
                            +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                            +
                            +
                            +
                              +
                            1. Make sure Grafana is running

                            2. +
                            +

                            Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                            +../_images/grafana.png +
                            +
                            +

                            Using Scylla Plugin with Grafana

                            +

                            Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                            +

                            Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                            +
                            +

                            Setting a monitoring user

                            +

                            This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                            +
                              +
                            • If you have not done so, enable authorization first.

                            • +
                            • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                            • +
                            • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                            • +
                            +
                            +
                            +

                            Installing the Plugin

                            +

                            Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                            +
                            +
                            +

                            Configure the Plugin

                            +

                            Add an entry to the datasource.yml file

                            +
                            - name: scylla-datasource
                            +  type: scylladb-scylla-datasource
                            +  orgId: 1
                            +  isDefault:
                            +  jsonData:
                            +  host: ''
                            +#  secureJsonData:
                            +#    user: 'scylla_monitoring'
                            +#    password: 'scylla_monitoring'
                            +
                            +
                            +

                            As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                            +
                            +
                            +

                            Enable the Plugin

                            +

                            Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                            +

                            See more about it the Grafana configurtion.

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/monitoring-stack.html b/branch-4.4/install/monitoring-stack.html new file mode 100644 index 000000000..a91f06466 --- /dev/null +++ b/branch-4.4/install/monitoring-stack.html @@ -0,0 +1,1100 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Install Scylla Monitoring Stack

                            +

                            This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                            +

                            The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                            +

                            For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                            +
                            +

                            Minimal Production System Recommendations

                            +
                              +
                            • CPU - at least 2 physical cores/ 4vCPUs

                            • +
                            • Memory - 15GB+ DRAM and proportional to the number of cores.

                            • +
                            • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                            • +
                            • Network - 1GbE/10GbE preferred

                            • +
                            +
                            +

                            Calculating Prometheus Minimal Disk Space requirement

                            +

                            Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                            +

                            Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                            +

                            For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                            +
                            6 * 16 * 15 * 12MB ~ 16GB
                            +
                            +
                            +

                            To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                            +
                            +
                            +

                            Calculating Prometheus Minimal Memory Space requirement

                            +

                            Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                            +

                            For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                            + +
                            + +++++++ + + + +
                            # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                            00
                            + +
                            +
                            +
                            +
                            +

                            Prerequisites

                            +
                              +
                            • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                            • +
                            • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                            • +
                            + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            Scylla Monitoring Stack Compatibility Matrix

                            Scylla Monitoring Stack Version

                            Prometheus Version

                            Grafana Version

                            4.5

                            2.45.0

                            10.0.2

                            4.4

                            2.44.0

                            9.5.2

                            4.3

                            2.42.0

                            9.3.8

                            4.2

                            2.41.0

                            9.3.4

                            4.1

                            2.38.0

                            9.1.0

                            4.0

                            2.34.0

                            8.5.2

                            3.11

                            2.32.0

                            8.3.4

                            3.10

                            2.32.0

                            8.3.3

                            3.9.2

                            2.29.1

                            8.2.7

                            3.9

                            2.29.1

                            8.1.1

                            3.8

                            2.27.1

                            7.5.7

                            3.7

                            2.25.2

                            7.4.0

                            3.6

                            2.18.1

                            7.3.5

                            3.5

                            2.18.1

                            7.1.5

                            3.4

                            2.18.1

                            6.7.3

                            +
                            +
                            +

                            Docker Post Installation

                            +

                            Docker post installation guide can be found here

                            +
                            +

                            Note

                            +

                            Avoid running the container as root.

                            +
                            +

                            To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                            +
                              +
                            1. Create the Docker group.

                            2. +
                            +
                            sudo groupadd docker
                            +
                            +
                            +
                              +
                            1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                            2. +
                            +
                            sudo usermod -aG docker $USER
                            +
                            +
                            +
                              +
                            1. Start Docker by calling:

                            2. +
                            +
                            sudo systemctl enable docker
                            +
                            +
                            +
                            +
                            +

                            Install Scylla Monitoring Stack

                            +

                            Procedure

                            +
                              +
                            1. Download and extract the latest Scylla Monitoring Stack binary;.

                            2. +
                            +
                            wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.4.5.tar.gz
                            +tar -xvf scylla-monitoring-4.4.5.tar.gz
                            +cd scylla-monitoring-scylla-monitoring-4.4.5
                            +
                            +
                            +

                            As an alternative, you can clone and use the Git repository directly.

                            +
                            git clone https://github.com/scylladb/scylla-monitoring.git
                            +cd scylla-monitoring
                            +git checkout branch-4.4
                            +
                            +
                            +
                              +
                            1. Start Docker service if needed

                            2. +
                            +
                            sudo systemctl restart docker
                            +
                            +
                            +
                            +
                            +

                            Configure Scylla Monitoring Stack

                            +

                            To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                            +

                            This configuration can be done from files, or using the Consul api.

                            +

                            Scylla Manager 2.0 and higher supports the Consul API.

                            +
                            +

                            Configure Scylla nodes from files

                            +
                              +
                            1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                            2. +
                            +
                            +

                            Note

                            +

                            It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                            +
                            +

                            For example:

                            +
                            - targets:
                            +      - 172.17.0.2
                            +      - 172.17.0.3
                            +  labels:
                            +      cluster: cluster1
                            +      dc: dc1
                            +
                            +
                            +
                            +

                            Note

                            +

                            If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                            +
                            +

                            Using IPV6

                            +

                            To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                            +

                            For example:

                            +
                            - targets:
                            +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                            +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                            +  labels:
                            +      cluster: cluster1
                            +      dc: dc1
                            +
                            +
                            +
                            +

                            Note

                            +

                            For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                            +
                            +

                            For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                            +
                            +

                            Note

                            +

                            By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                            +
                            +

                            If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                            +

                            For example:

                            +
                            ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                            +
                            +
                            +

                            Mark the different Data Centers with Labels.

                            +

                            As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                            +

                            You can use the genconfig.py script to generate the server file. For example:

                            +
                            ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                            +
                            +
                            +

                            This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                            +

                            OR

                            +

                            The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                            +
                            nodetool status | ./genconfig.py -NS
                            +
                            +
                            +

                            2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                            +

                            You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                            +

                            For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                            +
                            # List Scylla Manager end points
                            +
                            +- targets:
                            +  - 172.17.0.7:5090
                            +
                            +
                            +

                            Note that you do not need to add labels to the Scylla Manager targets.

                            +
                            +
                            +

                            Configure Scylla nodes using Scylla-Manager Consul API

                            +

                            Scylla Manager 2.0 has a Consul like API.

                            +

                            When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                            +

                            For example:

                            +
                            ./start-all.sh -L 10.10.0.1
                            +
                            +
                            +
                            +

                            Note

                            +

                            If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                            +
                            +
                            +
                            +

                            Connecting Scylla-Monitoring to ScyllaDB

                            +

                            Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                            +

                            You can limit the user to read only, currently it only read table from the system keyspace.

                            +

                            You can set a user and password from a file or environment variables.

                            +

                            If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                            +

                            To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                            +
                            +

                            Note

                            +

                            It is best to use a dedicated user and password with limited privileges.

                            +
                            +
                            +
                            +

                            Use an external directory for the Prometheus data directory

                            +

                            The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                            +
                            +

                            Note

                            +

                            Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                            +
                            +

                            If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                            +

                            In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                            +
                            +
                            +

                            Add Additional Prometheus Targets

                            +

                            There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                            +

                            The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                            +

                            You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                            +
                            - job_name: 'myservice'
                            +  # Override the global default and scrape targets from this job every 5 seconds.
                            +  scrape_interval: 5s
                            +  static_configs:
                            +    - targets:
                            +      - 17.0.0.1:7000
                            +
                            +
                            +
                            +
                            +
                            +

                            Start and Stop Scylla Monitoring Stack

                            +
                            +

                            Start

                            +
                            ./start-all.sh -d prometheus_data
                            +
                            +
                            +
                            +
                            +

                            Stop

                            +
                            ./kill-all.sh
                            +
                            +
                            +
                            +
                            +

                            Start a Specific Scylla Monitoring Stack Version

                            +

                            By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                            +

                            You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                            +

                            Multiple versions are supported. For example:

                            +
                            ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                            +
                            +
                            +

                            will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                            +
                            +
                            +

                            Accessing the localhost

                            +

                            The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                            +
                            ./start-all.sh -l -d prometheus-data
                            +
                            +
                            +
                            +
                            +

                            Configure rsyslog on each Scylla node

                            +

                            generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                            +

                            Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                            +

                            Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                            +

                            If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                            +
                            if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                            +
                            +
                            +

                            Restart rsyslog for the configuration to take effect.

                            +
                            systemctl restart rsyslog
                            +
                            +
                            +
                            +
                            +
                            +

                            View Grafana Dashboards

                            +

                            Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/start-all.html b/branch-4.4/install/start-all.html new file mode 100644 index 000000000..1e9566ea5 --- /dev/null +++ b/branch-4.4/install/start-all.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            The start-all.sh Command

                            +

                            Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                            +

                            The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                            +
                            +

                            General Options

                            +

                            -h Help, Print the help, and exit.

                            +

                            –version print the current Scylla-Monitoring stack version, and exit.

                            +

                            -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                            +

                            -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                            +

                            -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                            +

                            –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                            +
                            + + +
                            +

                            Alert Manager

                            +

                            The Alertmanager handles the alerts and takes the following parameters:

                            +

                            -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                            +

                            -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                            +

                            -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/install/thanos.html b/branch-4.4/install/thanos.html new file mode 100644 index 000000000..2c9ccb2a0 --- /dev/null +++ b/branch-4.4/install/thanos.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Using Thanos as Data Source With Scylla Monitoring Stack

                            +

                            Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                            +
                              +
                            • High-availability.

                            • +
                            • Horizontal scaling.

                            • +
                            • Backup.

                            • +
                            +

                            The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                            +

                            The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                            +
                            +

                            Using Thanos As a Prometheus Aggregator

                            +

                            There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                            +
                            +

                            Prometheus Configuration

                            +

                            We will assume you have two Prometheus servers running.

                            +
                              +
                            1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                            2. +
                            3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                            4. +
                            +
                            +
                            +

                            Thanos sidecar

                            +

                            The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                            +
                            docker run -d \
                            + -v /path/to/prom/dir:/data/prom:z \
                            + -i --name sidecar thanosio/thanos \
                            + sidecar \
                            + --grpc-address=0.0.0.0:10911 \
                            + --grpc-grace-period=1s \
                            + --http-address=0.0.0.0:10912 \
                            + --http-grace-period=1s \
                            + --prometheus.url=http://prometheus-ip:9090 \
                            + --tsdb.path=/data/prom \
                            + -p 10912:10912 \
                            + -p 10911:10911
                            +
                            +
                            +

                            After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                            +
                            +
                            +

                            Thanos query

                            +

                            Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                            +
                            docker run -d \
                            + --name thanos -- thanosio/thanos \
                            +   query \
                            +   --debug.name=query0 \
                            +   --log.level=debug \
                            +   --grpc-address=0.0.0.0:10903 \
                            +   --grpc-grace-period=1s \
                            +   --http-address=0.0.0.0:10904 \
                            +   --http-grace-period=1s \
                            +   --query.replica-label=prometheus \
                            +   --store={ip1}:10911 --store={ip2}:10911
                            +
                            +
                            +

                            After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                            +
                            +
                            +

                            Update Scylla Data source

                            +

                            The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                            +

                            The file you edit is a template file that replaces the file Grafana uses, next time you start.

                            +

                            Restart the Scylla Monitoring Stack it should now use Thanos.

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/intro.html b/branch-4.4/intro.html new file mode 100644 index 000000000..b75209b2e --- /dev/null +++ b/branch-4.4/intro.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            ScyllaDB Monitoring Stack

                            +

                            ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                            +_images/monitor.png +

                            The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                            +
                              +
                            • prometheus - Collects and stores metrics

                            • +
                            • grafan-loki - Parses logs and generates metrics and alerts

                            • +
                            • alertmanager - Handles alerts

                            • +
                            • grafana - Dashboards server

                            • +
                            +

                            A few optional components are used for additional services

                            +
                              +
                            • grafana-image-renderer - Allows you to download a dashboard as an image.

                            • +
                            • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                            • +
                            +
                            +

                            High Level Architecture

                            +_images/monitoring_stack1.png +

                            We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                            +

                            We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                            +

                            The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                            +

                            We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                            +

                            Choose a topic to get started:

                            + +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/objects.inv b/branch-4.4/objects.inv new file mode 100644 index 000000000..2e0b5512d Binary files /dev/null and b/branch-4.4/objects.inv differ diff --git a/branch-4.4/procedures/alerts/alerting.html b/branch-4.4/procedures/alerts/alerting.html new file mode 100644 index 000000000..d389daea5 --- /dev/null +++ b/branch-4.4/procedures/alerts/alerting.html @@ -0,0 +1,751 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Alerting

                            +

                            Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                            +

                            You can read more about Prometheus alerting here

                            +

                            By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                            +

                            In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                            +

                            The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                            +../../_images/monitoring_stack.png +
                            +

                            Prometheus Alerts

                            +

                            The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                            +

                            Each alert consists of:

                            +
                              +
                            • Name

                            • +
                            • What happened

                            • +
                            • For how long

                            • +
                            • What to report

                            • +
                            +

                            For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                            +
                            - alert: InstanceDown
                            +  expr: up == 0
                            +  for: 60s
                            +  labels:
                            +    severity: "2"
                            +  annotations:
                            +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                            +    summary: Instance {{ $labels.instance }} down
                            +
                            +
                            +

                            The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                            +

                            The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                            +

                            The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                            +

                            annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                            +
                            +
                            +

                            Alertmanager

                            +

                            The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                            +

                            The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                            +
                              +
                            • Routes: Represent a routing tree, the most specific rule, wins

                            • +
                            • Inhibition: Mute an alert, based on another alert

                            • +
                            • Receiver: Send a notification via email, sluck, etc’

                            • +
                            +

                            Check the Alertmanager documentation for details on how to specify a specific receiver.

                            +

                            In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                            +
                            +
                            +

                            Tips When Adding an Alert

                            +

                            It’s worse having an alert that does not work, than not having an alert at all

                            +

                            There are multiple ways you can use to make sure your alert is set correctly:

                            +
                              +
                            • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                            • +
                            • Force the alert to be active by reducing the limits or the duration.

                            • +
                            • When possible simulate the actual scenario and see that the alert works as expected.

                            • +
                            +

                            For example, low available disk space.

                            +

                            Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                            +

                            Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                            +

                            Starting with a simple working expression helps you bisect problems.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/procedures/alerts/index.html b/branch-4.4/procedures/alerts/index.html new file mode 100644 index 000000000..d42712cb0 --- /dev/null +++ b/branch-4.4/procedures/alerts/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Alert Manager

                            +
                            +
                            +

                            Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/procedures/datadog/index.html b/branch-4.4/procedures/datadog/index.html new file mode 100644 index 000000000..2adf185fd --- /dev/null +++ b/branch-4.4/procedures/datadog/index.html @@ -0,0 +1,748 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Datadog Integration

                            +

                            The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                            +
                              +
                            1. Installing and configuring the Datadog Agent.

                            2. +
                            3. Add Datadog recording rules.

                            4. +
                            5. Loading Scylla dashboard to Datadog.

                            6. +
                            7. Optionally load Monitor (Alerts).

                            8. +
                            +
                            +

                            Note

                            +

                            Scylla Cloud users, use and update the proper configuration file.

                            +
                            +
                            +

                            Install And configure the Datadog Agent

                            +

                            Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                            +

                            Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                            +
                            +

                            Scylla Cloud Users

                            +

                            Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                            +

                            Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                            +
                            +
                            +

                            Other Scylla Users

                            +

                            Other Scylla users, download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                            +
                            +
                            +

                            Post configuration

                            +

                            Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                            +
                            +

                            Note

                            +

                            By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                            +
                            +
                            +
                            +
                            +

                            Add datadog recording rules

                            +

                            Non Scylla Cloud users, download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                            +

                            Cloud users, skip this step, it’s been take care for by the cloud.

                            +
                            +
                            +

                            Upload the Dashboard

                            +

                            Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                            +
                            +
                            +

                            Using the Dashboard

                            +

                            We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                            +../../_images/datadog.png +

                            The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                            +
                            +

                            Note

                            +

                            Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                            +
                            +
                            +
                            +

                            Adding Monitor

                            +

                            Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/procedures/index.html b/branch-4.4/procedures/index.html new file mode 100644 index 000000000..d54c4d602 --- /dev/null +++ b/branch-4.4/procedures/index.html @@ -0,0 +1,668 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            ScyllaDB Monitoring Stack Procedures

                            +
                            +
                            +

                            There are several reference guides available which give additional information. Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/procedures/updating-dashboard.html b/branch-4.4/procedures/updating-dashboard.html new file mode 100644 index 000000000..873f30a62 --- /dev/null +++ b/branch-4.4/procedures/updating-dashboard.html @@ -0,0 +1,960 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Adding and Modifying Dashboards

                            +

                            This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                            +

                            It covers dashboard templates and how to modify them.

                            + +
                            +

                            General Limitations

                            +

                            Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                            +
                            +

                            Consistency Between Restarts

                            +

                            By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                            +
                            +
                            +

                            Consistency Between Upgrades

                            +

                            As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                            +
                            +

                            Note

                            +

                             You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                            +
                            +

                            At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                            +
                            +
                            +
                            +

                            Using Templated Dashboards

                            +

                            Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                            +

                            Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                            +

                            For example a typical graph panel would look like this:

                            +
                            {
                            +    "aliasColors": {},
                            +    "bars": false,
                            +    "datasource": "prometheus",
                            +    "editable": true,
                            +    "error": false,
                            +    "fill": 0,
                            +    "grid": {
                            +        "threshold1": null,
                            +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                            +        "threshold2": null,
                            +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                            +    },
                            +    "gridPos": {
                            +        "h": 6,
                            +        "w": 10,
                            +        "x": 0,
                            +        "y": 4
                            +    },
                            +    "id": 2,
                            +    "isNew": true,
                            +    "legend": {
                            +        "avg": false,
                            +        "current": false,
                            +        "max": false,
                            +        "min": false,
                            +        "show": false,
                            +        "total": false,
                            +        "values": false
                            +    },
                            +    "lines": true,
                            +    "linewidth": 2,
                            +    "links": [],
                            +    "nullPointMode": "connected",
                            +    "percentage": false,
                            +    "pointradius": 5,
                            +    "points": false,
                            +    "renderer": "flot",
                            +    "seriesOverrides": [
                            +        {}
                            +    ],
                            +    "span": 5,
                            +    "stack": false,
                            +    "steppedLine": false,
                            +    "targets": [
                            +        {
                            +            "expr": "sum(node_filesystem_avail) by (instance)",
                            +            "intervalFactor": 1,
                            +            "legendFormat": "",
                            +            "refId": "A",
                            +            "step": 1
                            +        }
                            +    ],
                            +    "timeFrom": null,
                            +    "timeShift": null,
                            +    "title": "Available Disk Size",
                            +    "tooltip": {
                            +        "msResolution": false,
                            +        "shared": true,
                            +        "sort": 0,
                            +        "value_type": "cumulative"
                            +    },
                            +    "transparent": false,
                            +    "type": "graph",
                            +    "xaxis": {
                            +        "show": true
                            +    },
                            +    "yaxes": [
                            +        {
                            +            "format": "percent",
                            +            "logBase": 1,
                            +            "max": 101,
                            +            "min": 0,
                            +            "show": true
                            +        },
                            +        {
                            +            "format": "short",
                            +            "logBase": 1,
                            +            "max": null,
                            +            "min": null,
                            +            "show": true
                            +        }
                            +    ]
                            +}
                            +
                            +
                            +

                            As you can imagine, most panels would have similar values.

                            +

                            To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                            +
                            +

                            The Template Class System

                            +

                            The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                            +

                            The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                            +

                            In the template file, you can also add or override attributes.

                            +

                            The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                            +

                            When generating dashboards, each class will be replaced by its definition.

                            +

                            For example, a row in the type.json is defined as:

                            +
                            {
                            + "base_row": {
                            +     "collapse": false,
                            +     "editable": true
                            + },
                            + "row": {
                            +     "class": "base_row",
                            +     "height": "250px"
                            + }
                            + }
                            +
                            +
                            +

                            Will be used like in a template:

                            +
                            {
                            +     "class": "row",
                            +     "height": "150px",
                            +     "panels": [
                            +     ]
                            +}
                            +
                            +
                            +

                            And the output will be:

                            +
                            {
                            +     "class": "row",
                            +     "collapse": false,
                            +     "editable": true,
                            +     "height": "150px",
                            +     "panels": [
                            +
                            +     ]
                            +}
                            +
                            +
                            +

                            We can see that the template added the panels attribute and that it overrides the height attribute.

                            +
                            +
                            +

                            Panel Example

                            +

                            Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                            +
                            {
                            +     "class": "row",
                            +     "panels": [
                            +         {
                            +             "class": "bytes_panel",
                            +             "span": 3,
                            +             "targets": [
                            +                 {
                            +                     "expr": "sum(node_filesystem_avail) by (instance)",
                            +                     "intervalFactor": 1,
                            +                     "legendFormat": "",
                            +                     "metric": "",
                            +                     "refId": "A",
                            +                     "step": 1
                            +                 }
                            +             ],
                            +             "title": "Available Disk Size"
                            +         }
                            +     ]
                            +}
                            +
                            +
                            +

                            In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                            +

                            You can also see that the span attribute is overridden to set the panel size.

                            +

                            To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                            +
                            +
                            +

                            Grafana Formats and Layouts

                            +

                            The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                            +

                            Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                            +

                            The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                            +

                            To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                            +

                            The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                            +

                            You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                            +

                            gridPos has the following attributes:

                            +
                            {
                            +   "x": 0,
                            +   "y": 0,
                            +   "w": 24,
                            +   "h": 4
                            + }
                            +
                            +
                            +

                            When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                            +
                            {
                            +   "gridPos": {
                            +      "h": 2
                            +    }
                            +}
                            +
                            +
                            +
                            +
                            +

                            Generating the dashboards from templates (generate-dashboards.sh)

                            +
                            +

                            Prerequisite

                            +

                            Python 2.7

                            +

                            make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                            +

                            Use the -h flag to get help information.

                            +

                            You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                            +

                            When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                            +

                            For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                            +

                            .\generate-dashboards.sh -v 2020.1

                            +
                            +

                            Note

                            +

                            generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                            +
                            +
                            +
                            +
                            +

                            Validation

                            +

                            After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                            +

                            Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/reference/index.html b/branch-4.4/reference/index.html new file mode 100644 index 000000000..30b081e29 --- /dev/null +++ b/branch-4.4/reference/index.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Reference Guide

                            +
                            +
                            +

                            There are several reference guides available which give additional information. Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/reference/matrix.html b/branch-4.4/reference/matrix.html new file mode 100644 index 000000000..34ddcd19f --- /dev/null +++ b/branch-4.4/reference/matrix.html @@ -0,0 +1,850 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Support Matrix

                            +

                            The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                            + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                            Scylla Monitoring Stack Version

                            Scylla Open Source Version

                            Scylla Enterprise Version

                            Node_exporter[1] Version

                            Scylla Manager Version

                            4.5

                            5.0,5.1,5.2,5.4

                            2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                            1.4.1

                            3.0, 3.1, 3.2

                            4.4.5

                            5.0,5.1,5.2,5.4

                            2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                            1.4.1

                            3.0, 3.1, 3.2

                            4.4

                            5.0,5.1,5.2

                            2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                            1.4.1

                            3.0, 3.1

                            4.3

                            5.0,5.1,5.2

                            2020.1, 2021.1, 2022.1, 2022.2

                            1.4.1

                            2.5, 2.6, 3.0

                            4.2

                            4.5,4.6,5.0,5.1

                            2020.1, 2021.1, 2022.1, 2022.2

                            1.4.1

                            2.5, 2.6, 3.0

                            4.1

                            4.5,4.6,5.0,5.1

                            2020.1, 2021.1, 2022.1, 2022.2

                            0.17

                            2.5, 2.6, 3.0

                            4.0

                            4.3, 4.4, 4.5, 4.6, 5.0

                            2020.1, 2021.1, 2022.1

                            0.17

                            2.3, 2.4, 2.5, 2.6, 3.0

                            3.11

                            4.3, 4.4, 4.5, 4.6, 5.0

                            2020.1, 2021.1, 2022.2

                            0.17

                            2.3, 2.4, 2.5, 2.6

                            3.10

                            4.3, 4.4, 4.5, 4.6

                            2020.1, 2021.1

                            0.17

                            2.3, 2.4, 2.5, 2.6

                            3.9

                            4.3, 4.4, 4.5, 4.6

                            2020.1, 2021.1

                            0.17

                            2.3, 2.4, 2.5

                            3.8

                            4.3, 4.4, 4.5

                            2020.1, 2021.1

                            0.17

                            2.3, 2.4, 2.5

                            3.7

                            4.2, 4.3, 4.4

                            2019.1, 2020.1, 2021.1

                            0.17

                            2.2, 2.3

                            3.6.3

                            4.2, 4.3, 4.4

                            2019.1, 2020.1, 2021.1

                            0.17

                            2.2, 2.3, 2.1

                            3.6

                            4.1, 4.2, 4.3

                            2019.1, 2020.1

                            0.17

                            2.1, 2.2, 2.3

                            3.6.1

                            4.1, 4.2, 4.3

                            2019.1, 2020.1

                            0.17

                            2.1, 2.2

                            3.6.1

                            4.1, 4.2, 4.3, 4.4

                            2019.1, 2020.1

                            0.17

                            2.1, 2.2

                            3.5

                            3.3, 4.0, 4.1, 4.2

                            2019.1, 2020.1

                            0.17

                            2.0, 2.1, 2.2

                            3.4.3

                            3.3, 4.0, 4.1, 4.2

                            2019.1, 2020.1

                            0.17

                            2.0, 2.1

                            3.4

                            3.3, 4.0, 4.1

                            2018.1, 2019.1

                            0.17

                            2.0, 2.1

                            3.3

                            3.1, 3.2, 3.3, 4.0

                            2018.1, 2019.1

                            0.17

                            1.4, 2.0, 2.1

                            3.2

                            3.1, 3.2, 3.3

                            2018.1, 2019.1

                            0.17

                            1.4, 2.0

                            3.1

                            2.3, 3.0, 3.1, 3.2

                            2018.1, 2019.1

                            0.17

                            1.3, 1.4, 2.0

                            3.0

                            2.3, 3.0, 3.1, 3.2

                            2018.1, 2019.1

                            0.17

                            1.3, 1.4

                            2.4

                            2.3, 3.0, 3.1

                            2018.1, 2019.1

                            0.14, 0.17

                            1.3, 1.4

                            2.3

                            2.3, 3.0

                            2018.1, 2019.1

                            0.14, 0.17

                            1.3

                            2.2

                            2.3, 3.0

                            2018.1, 2019.1

                            0.14, 0.17

                            1.3

                            2.1

                            2.3, 3.0

                            2018.1

                            0.14, 0.17

                            1.3

                            +

                            [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/reference/monitoring-apis.html b/branch-4.4/reference/monitoring-apis.html new file mode 100644 index 000000000..1ec6e4654 --- /dev/null +++ b/branch-4.4/reference/monitoring-apis.html @@ -0,0 +1,687 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Interfaces

                            +

                            Scylla exposes two interfaces for online monitoring, as described below

                            +
                            +

                            Prometheus API

                            +

                            By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                            +

                            For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                            +

                            You can change the Prometheus listening address and port in scylla.yaml file

                            +
                            # prometheus port
                            +# By default, Scylla opens prometheus API port on port 9180
                            +# setting the port to 0 will disable the prometheus API.
                            +prometheus_port: 9180
                            +#
                            +# prometheus address
                            +# By default, Scylla binds all interfaces to the prometheus API
                            +# It is possible to restrict the listening address to a specific one
                            +prometheus_address: 0.0.0.0
                            +
                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/robots.txt b/branch-4.4/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.4/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.4/search.html b/branch-4.4/search.html new file mode 100644 index 000000000..bf2f42945 --- /dev/null +++ b/branch-4.4/search.html @@ -0,0 +1,645 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + + + +
                            + + + + + +
                            + + +
                            + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/searchindex.js b/branch-4.4/searchindex.js new file mode 100644 index 000000000..6c0e90b4b --- /dev/null +++ b/branch-4.4/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/cqlReverseOrder", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/cqlReverseOrder.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Some queries use reverse order", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "5": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 28, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "monitor": [0, 2, 4, 7, 10, 14, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 27, 28, 29, 30, 31, 32, 33, 34, 36, 37, 38, 39, 40, 41, 42], "scylladb": [0, 2, 4, 5, 19, 21, 22, 23, 24, 25, 30, 31, 33, 34, 36, 38, 39], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 27, 28, 29, 30, 33, 34, 35, 36, 38, 40, 41, 42], "full": [0, 1, 3, 6, 9, 10, 27], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 36, 38, 40], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 30, 34, 40, 42], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 40], "tool": [0, 1, 3, 9, 19, 42], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 26, 42], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25, 26], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 26, 35, 42, 43], "consist": [1, 9, 10, 12, 21, 35], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 36, 38], "store": [1, 5, 8, 9, 14, 22, 24, 25, 26, 28, 29, 40], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 26, 42], "alertmanag": [1, 2, 7, 9, 22, 24, 25, 26], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 27, 42], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 43], "topic": [1, 3, 9, 11, 13, 15, 18, 43], "get": [1, 6, 8, 9, 10, 14, 25, 28, 35, 39, 40, 41, 42], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 26, 34], "user": [1, 2, 6, 7, 9, 27, 42], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25, 26], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9, 33], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 29, 30], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25, 26], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 27, 42], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 30, 32, 34, 35, 41, 42, 43], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 27, 30, 34, 35, 42, 43], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 27, 31, 35, 42], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25, 26], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 32, 33, 35, 36, 38, 40, 42], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 28, 31, 36, 42], "more": [2, 4, 5, 6, 10, 14, 17, 19, 27, 30, 33, 34, 36, 39, 42], "manual": [2, 19], "step": [2, 5, 8, 12, 14, 19, 21, 22, 23, 24, 25, 26], "onc": [2, 12, 21, 25, 32, 40, 42], "configur": [2, 7, 10, 14, 17, 19, 21, 34, 35], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 26, 34, 35, 36, 37, 40, 41, 42, 43], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 26, 35, 40, 42], "wai": [2, 5, 7, 10, 12, 19, 25, 33, 42], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 28, 31, 32, 33, 39, 42], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 26, 28, 30, 31, 34, 35, 36, 42], "both": [2, 5, 6, 12, 19, 22, 24, 25, 26, 42], "In": [2, 6, 10, 14, 19, 21, 25, 34, 42], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 27, 40, 42], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 34, 42], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 26, 29, 34, 35, 36, 41, 42], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 35, 42], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 42], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25, 26], "among": [2, 35], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25, 26], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 35], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 26, 42], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 42], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 35, 36, 42], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 35, 36, 39, 42], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 26, 28, 34, 35, 42], "advis": [2, 35], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 26, 42], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26], "databas": [2, 5, 7, 21, 30, 42], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 34, 42], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 27, 31, 34], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 27, 33, 37, 42], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25, 26], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 42], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 33, 34, 36, 38, 40, 42], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 26, 32, 33, 42], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 34, 41], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 26, 34, 42], "command": [2, 6, 8, 19, 21, 22, 24, 25, 26, 34], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25, 26], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 34], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25, 26], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 34], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "1": [2, 5, 6, 7, 8, 12, 14, 16, 20, 22, 24, 25, 26], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 28, 31, 34, 35, 37, 41, 42], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 26, 28, 29, 30, 42], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "24": [2, 14, 25], "0": [2, 5, 6, 7, 8, 10, 14, 16, 17, 21, 22, 23, 24, 25, 26], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25, 26], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25, 26], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 34], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 14, 19, 22, 24, 25, 26], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 25, 35], "json": [2, 12, 14], "9": [2, 6, 16, 25], "3": [2, 4, 5, 6, 14, 16, 20, 36], "11": [2, 6, 16], "3000": [2, 5, 6, 22, 24, 25, 26], "1000": [2, 34], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 14, 29, 36, 38, 42], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25, 26], "dir": [2, 7, 8, 22, 24, 25, 26], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 10, 12, 14, 16, 20, 24, 36], "7": [2, 5, 6, 14, 16], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 32, 41], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "42": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25, 26], "prom_rul": [2, 5, 12, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25, 26], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 42], "down": [2, 10, 19, 21, 22, 24, 25, 26, 28, 34, 36], "begin": [3, 11, 13, 15, 18, 43], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 26, 30, 35, 36, 38, 40, 42], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 41], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 26, 34, 36, 40], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 34, 40], "section": [4, 5, 6, 12, 19, 21, 24, 25, 26, 42], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 34, 35, 39, 42], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 30, 36, 38, 42], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 31, 42], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 42], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25, 26], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 39], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 28, 29, 30, 35, 36, 38, 39, 42], "cluster": [4, 5, 6, 12, 19, 25, 33, 42], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 28, 30, 35, 40, 42], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 25, 30, 42], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 32, 40, 42], "need": [4, 5, 6, 7, 8, 12, 14, 19, 25, 28, 29, 30, 41, 42], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 37, 41, 42], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25, 26], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 26, 42], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 28, 34, 42], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 40, 42], "fast": [4, 5, 6, 41], "enough": [4, 5, 6, 41], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 28, 35, 42], "out": [4, 5, 6, 8, 41], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 35, 36, 38], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25, 26], "look": [4, 5, 6, 8, 10, 12, 14, 25, 42], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 27, 30, 42], "take": [4, 5, 6, 7, 12, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 42], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 35], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 36], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 42], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25, 26], "help": [5, 7, 10, 14, 42], "pleas": [5, 19], "most": [5, 10, 14, 25, 35, 37, 42], "common": [5, 7, 42], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 39, 40], "alreadi": [5, 22, 24, 25, 26], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 40], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 28, 42], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 30, 35, 36, 38, 39, 41, 42], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 26, 28, 29, 36, 42], "support": [5, 6, 14, 15, 27, 33, 42], "want": [5, 6, 10, 22, 24, 25, 26], "latest": [5, 6, 7, 22, 24, 25, 26], "releas": [5, 21, 22, 23, 24, 25, 26], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25, 26], "http": [5, 6, 8, 19, 21, 22, 24, 25, 26, 30, 31, 33, 39], "com": [5, 6, 22, 24, 25, 26, 30, 31, 33, 39], "archiv": [5, 6, 22, 24, 25, 26], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25, 26], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 42], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24, 26], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 34], "cp": [5, 22, 23, 24, 25, 26], "p": [5, 7, 8, 19, 21, 22, 24, 25, 26], "cd": [5, 6, 22, 24, 25, 26], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25, 26], "browser": [5, 6, 8, 14, 19, 22, 24, 25, 26], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 26, 37, 38, 42], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 26, 42], "describ": [5, 6, 8, 17, 19, 42], "respons": [5, 10], "pars": [5, 9, 14, 32, 42], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 36, 38], "load": [5, 6, 12, 19, 25, 27, 30, 31, 42], "multipl": [5, 6, 7, 8, 9, 10, 14, 28, 31, 32, 39, 41, 42], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 26, 30, 34, 42], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24, 26], "relat": [5, 42], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 42], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 12, 14, 27, 28, 37, 40, 42], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 34, 37, 39, 40, 41, 42], "besid": [5, 7, 21, 42], "expect": [5, 10, 22, 24, 25, 26], "scrap": [5, 7, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 12, 19, 21, 23, 25, 30, 32, 34, 40, 42], "import": [5, 6, 7, 12, 21, 22, 24, 25, 26, 34], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25, 26], "code": [5, 35], "shell": 5, "correct": [5, 23], "static": [5, 34], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 33], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 35, 42], "typic": [5, 14, 25, 28, 30, 40, 42], "node_export": [5, 6, 7, 9, 16], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 31, 42], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 41], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 35, 42], "seri": [5, 8], "commun": 5, "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 39, 41, 43], "instead": [5, 6, 8, 19, 25, 42], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 36], "even": [5, 6, 7, 19], "center": [5, 6, 8, 42], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 42], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25, 26], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 27, 32], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24, 26], "scylla_reactor_util": 5, "At": [5, 14, 24, 25, 26], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 35], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25, 26], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 28, 29, 36, 40, 42], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 42], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 35, 39], "tabl": [5, 6, 10, 16, 27, 35, 42], "apivers": 5, "type": [5, 14, 42], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 35, 43], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 26, 34, 35, 42], "give": [5, 13, 15], "strongli": 5, "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 27, 30, 35, 42], "option": [5, 6, 8, 9, 12, 19, 21, 25, 34], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 34, 35], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 26, 42], "new": [5, 6, 12, 19, 40], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 42], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 35, 42], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 32, 34], "mention": [5, 14], "previous": [5, 24, 25, 26], "safer": [5, 42], "dedic": [5, 6], "limit": [5, 6, 8, 10, 31, 34, 42], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 35], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "45": 6, "10": [6, 10, 14, 16], "44": 6, "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "32": 6, "29": 6, "25": [6, 19], "18": 6, "avoid": [6, 14, 19, 31, 33, 42], "root": [6, 19, 22, 24, 25, 26], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25, 26], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 30, 42], "higher": [6, 25, 30, 42], "wish": [6, 7], "match": [6, 42], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 34], "inform": [6, 7, 13, 14, 15, 17, 25, 27, 28, 29], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25, 26], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 39], "place": [6, 7, 8, 12, 14, 42], "outsid": [6, 7, 21], "result": [6, 7, 21, 28, 30, 31, 34, 40, 42], "lost": [6, 7, 14, 42], "exist": [6, 14, 42], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 34, 42], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25, 26], "2019": [6, 16, 39], "reach": [6, 8, 12, 30, 34, 36, 42], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 30, 31, 36, 38, 42], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 40], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 36, 41], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 29, 32, 35], "addit": [7, 8, 9, 10, 13, 15, 25, 42], "specif": [7, 10, 12, 17, 19, 37, 42], "driver": [7, 30, 31, 39, 42], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 41], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 27, 28, 29, 30, 31, 36, 38, 42], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25, 26], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 35], "disk": [7, 10, 14, 19, 27, 29, 35], "possibl": [7, 10, 17, 33, 42], "api": [7, 8, 21], "resolv": 7, "explicitli": [7, 14], "ca": 7, "optim": [7, 32, 39, 43], "drop": [7, 41, 42], "while": [7, 19, 21, 22, 24, 25, 26, 34], "cdc": 7, "request": [7, 17, 35, 41], "how": [7, 8, 10, 14, 22, 24, 25, 26, 28, 29, 30, 35, 42], "someth": [7, 10, 11, 14, 25, 40], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14, 19], "horizont": 8, "scale": [8, 41], "backup": 8, "benefit": [8, 42], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25, 26], "reason": [8, 14, 19, 25, 38, 42], "why": 8, "million": 8, "singl": [8, 14, 35], "capac": 8, "sometim": 8, "traffic": [8, 19, 39, 42], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 26, 29], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 35], "10903": 8, "10904": 8, "replica": [8, 28, 29, 30, 35, 36, 42], "abov": [8, 22, 24, 25, 26], "last": [8, 25], "db_address": 8, "could": [8, 35, 39, 41, 42], "long": [8, 10, 25, 40], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 42], "distribut": [9, 30, 39, 42], "email": [9, 10], "slack": [9, 10], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11, 35], "wrong": [10, 11, 14, 19, 25, 40, 42], "shown": [10, 19, 22, 24, 25, 26], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 33, 42], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 42], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 43], "annot": 10, "descript": [10, 35], "been": [10, 12], "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 42], "rout": [10, 30, 42], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 28], "simul": 10, "actual": [10, 38], "low": [10, 42], "space": 10, "lower": [10, 42], "fire": 10, "show": [10, 14, 16, 25, 42], "propag": 10, "valu": [10, 14, 32, 34, 40, 42], "similar": [10, 14], "free": 10, "big": [10, 42], "bisect": 10, "problem": [10, 35, 41, 42], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 35], "shard": [12, 19, 25, 35], "dd": 12, "non": [12, 19, 21, 29, 30, 35, 39, 42], "cost": [12, 42], "skip": [12, 25], "care": [12, 27, 28, 29, 42], "resembl": [12, 14], "filter": [12, 35], "perspect": 12, "graph": [12, 14, 21, 23, 25, 42], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "explain": [14, 22, 24, 25, 26, 35], "intern": [14, 30, 42], "potenti": [14, 35, 42], "issu": [14, 19, 35, 39, 42], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 35], "maintain": 14, "too": [14, 34, 40], "verbos": 14, "element": [14, 35], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 35, 36, 38], "fill": [14, 41], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 35], "nullpointmod": 14, "percentag": [14, 42], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 31, 42], "tooltip": 14, "msresolut": 14, "share": [14, 34], "sort": [14, 33, 42], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 42], "inherit": 14, "row": [14, 33, 42], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 37], "12": [14, 19, 25], "wa": [14, 42], "larger": 14, "break": [14, 31, 42], "later": 14, "were": [14, 21, 42], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": [14, 35], "usual": [14, 19, 35, 42], "easier": 14, "wrapper": 14, "re": [14, 30], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2023": 16, "2018": [16, 31], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "56090": 19, "old": [19, 22, 23, 24, 25, 26], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 36], "post": 19, "past": [19, 23], "mai": [19, 34, 35, 36, 42], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 36], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 42], "align": 19, "On": [19, 35], "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 30, 42], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 27, 28, 29, 31, 36, 38, 42], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "dure": [19, 22, 24, 25, 26], "fallback": 19, "mechan": [19, 25, 28], "present": [19, 25], "newer": [19, 24, 25, 26], "reli": [19, 25, 42], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25, 26], "increas": [19, 31, 34, 42], "might": [19, 40], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25, 26], "migrat": [21, 22, 24, 26], "lose": 21, "histor": [21, 25], "process": [21, 34, 41], "safe": 21, "page": [21, 23, 35], "unzip": [21, 22, 23, 24, 25, 26], "3001": [21, 22, 24, 25, 26], "9091": [21, 22, 24, 25, 26], "9094": 21, "fail": [21, 28, 30, 35, 42], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25, 26], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25, 26], "back": [21, 28], "uninstal": [22, 24, 25, 26], "minor": [22, 24, 25, 26], "9095": [22, 24, 25, 26], "brows": [22, 24, 25, 26], "satisfi": [22, 24, 25, 26], "shut": [22, 24, 25, 26], "caus": [22, 24, 25, 26, 30, 42], "blackout": [22, 24, 25, 26], "normal": [22, 24, 25, 26], "oper": [22, 24, 25, 26, 35, 42], "complet": [22, 24, 25, 26], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25, 26], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 27, 35, 42], "ensur": 25, "patch": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 29], "latenc": [25, 30, 34, 35, 42], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 42], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 28], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 28, 29, 42], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 34, 41], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 41], "half": 25, "primari": [27, 42], "kei": [27, 33, 42], "scan": 27, "These": [27, 42], "kind": [27, 42], "bigger": 27, "replicationfactor": [28, 29], "piec": 28, "determin": [28, 29, 36, 42], "repli": [28, 29, 31, 36, 38, 42], "unavail": [28, 42], "client": [28, 31, 35, 42], "respond": 28, "accompani": 28, "deep": 28, "understand": 28, "acknowledg": 29, "coordin": [29, 30, 36, 38, 42], "hint": 29, "fact": 29, "yet": 29, "ideal": [30, 42], "resourc": [30, 33, 42], "replic": [30, 36, 38, 42], "prepar": [30, 35, 39], "statement": [30, 32, 35, 39], "balanc": [30, 34, 35, 42], "polici": 30, "cours": 30, "intro": 30, "recap": 30, "ring": [30, 42], "architectur": 30, "chunk": [31, 42], "overal": [31, 34, 42], "thu": 31, "www": [31, 39], "07": 31, "13": 31, "effici": [31, 42], "concret": 32, "thumb": 32, "alwai": 32, "favor": 32, "partit": [33, 35], "BY": [33, 42], "ineffici": [33, 42], "consum": 33, "doc": 33, "background": [34, 41], "much": [34, 42], "impact": [34, 35], "compaction_static_shar": 34, "50": 34, "indic": [34, 35, 40, 41, 42], "overli": 34, "slow": 34, "enforc": 34, "min_threshold": 34, "compaction_enforce_min_threshold": 34, "bucket": 34, "sstabl": 34, "stc": 34, "recogn": 35, "bad": 35, "practic": [35, 39], "solv": 35, "left": 35, "categori": [35, 42], "jump": 35, "warn": 35, "cell": 35, "model": [35, 39, 41, 42], "imbal": 35, "imbalanc": 35, "hot": 35, "bottleneck": [35, 39], "cach": 35, "hit": 35, "awar": 35, "order": [35, 42], "due": 35, "unsatisfi": 35, "faulti": 35, "evict": 35, "answer": [36, 38], "aka": 36, "factor": 36, "quorum": [36, 42], "hardwar": [37, 41], "occur": 37, "leav": 38, "risk": 38, "identifi": [38, 42], "evenli": 39, "across": 39, "becom": 39, "explan": 39, "08": 39, "field": 40, "being": 40, "defi": 40, "purpos": 40, "shed": 41, "repair": 41, "que": 41, "upper": 42, "gaug": 42, "inspect": 42, "zero": 42, "mislead": 42, "panel": 42, "holder": 42, "prevent": 42, "inject": 42, "did": 42, "compound": 42, "column": 42, "ks1": 42, "table_demo": 42, "text": 42, "int": 42, "desc": 42, "cat1": 42, "asc": 42, "overhead": 42, "thing": 42, "major": 42, "success": 42, "hurt": 42, "cl": 42, "expens": 42, "term": 42, "ONE": 42, "local_quorum": 42, "local_on": 42, "nearest": 42, "advisor": 43}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13, 26], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 35, 43], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 35, 43], "us": [2, 5, 6, 8, 12, 14, 27, 28, 29, 33, 43], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25, 26], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25, 26], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25, 26], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 29, 35, 43], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 41], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 37], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 34], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 31, 39], "node": [6, 37], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": [6, 17], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25, 26], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 26, 35, 42], "all": [7, 22, 24, 25, 26, 28], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25, 26], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 27, 28, 29, 30, 31, 32, 33, 39, 42], "updat": 8, "high": 9, "level": [9, 19, 28, 29, 36, 42], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25, 26], "modifi": 14, "limit": 14, "consist": [14, 28, 29, 36, 42], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25, 26], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25, 26], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25, 26], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25, 26], "fail": [19, 36, 38], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 37], "sign": 19, "server": [19, 22, 24, 25, 26], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 30, 31, 32, 39], "empti": 19, "reduc": 19, "total": 19, "number": 19, "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25, 26], "latest": 21, "new": [21, 22, 23, 24, 25, 26], "4": [21, 25, 26], "move": [21, 22, 24, 25, 26], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25, 26], "link": [21, 22, 23, 24, 25, 26, 29, 30, 31, 33, 39], "y": [22, 24, 25, 26], "": [22, 24, 25, 26], "i": [22, 24, 25, 26, 37], "run": [22, 24, 25, 26], "correct": [22, 24, 25, 26], "correctli": [22, 24, 26], "kill": [22, 24, 25, 26], "test": [24, 25, 26], "mode": [24, 25, 26], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [27, 28, 29, 30, 31, 32, 33, 36, 38], "allow": [27, 42], "filter": [27, 42], "ani": 29, "univers": [29, 30], "token": [30, 42], "awar": [30, 42], "select": 31, "non": [31, 32], "page": [31, 42], "blog": [31, 39], "prepar": [32, 40, 42], "revers": [33, 42], "order": 33, "document": 33, "compact": 34, "take": 34, "lot": 34, "cpu": 34, "advisor": 35, "section": 35, "oper": [36, 38], "due": 36, "unsatisfi": 36, "o": 37, "can": 37, "indic": 37, "faulti": 37, "replica": 38, "side": 38, "cql": [39, 42], "balanc": 39, "among": 39, "shard": 39, "statement": [40, 42], "cach": 40, "evict": 40, "overload": 41, "optim": 42, "read": 42, "cross": 42, "dc": 42, "request": 42}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some queries use reverse order": [[33, "some-queries-use-reverse-order"]], "Documentation link": [[33, "documentation-link"]], "CQL queries are not balanced among shards": [[39, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[39, "blog-post-link"]], "Some operations failed on the replica side": [[38, "some-operations-failed-on-the-replica-side"]], "Some queries are non-prepared": [[32, "some-queries-are-non-prepared"]], "Some SELECT queries are non-paged": [[31, "some-select-queries-are-non-paged"]], "Blog-post Links": [[31, "blog-post-links"]], "Scylla Monitoring Stack Advisor": [[35, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[35, "the-advisor-section"]], "I/O Errors can indicate a node with a faulty disk": [[37, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some queries are not token-aware": [[30, "some-queries-are-not-token-aware"]], "University link": [[30, "university-link"]], "Compaction takes lots of memory and CPU": [[34, "compaction-takes-lots-of-memory-and-cpu"]], "Some operation failed due to unsatisfied consistency level": [[36, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[17, "prometheus-api"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Validation": [[14, "validation"], [21, "validation"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Some queries use ALLOW FILTERING": [[27, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "Upgrade Procedure": [[23, "upgrade-procedure"], [24, "upgrade-procedure"], [21, "upgrade-procedure"], [22, "upgrade-procedure"], [25, "upgrade-procedure"], [26, "upgrade-procedure"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Related Links": [[23, "related-links"], [24, "related-links"], [21, "related-links"], [22, "related-links"], [25, "related-links"], [26, "related-links"]], "Some queries use Consistency Level: ANY": [[29, "some-queries-use-consistency-level-any"]], "Link to Scylla university": [[29, "link-to-scylla-university"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Setting the server\u2019s files": [[24, "setting-the-server-s-files"], [22, "setting-the-server-s-files"], [25, "setting-the-server-s-files"], [26, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[24, "validate-the-new-version-is-running-the-correct-version"], [22, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[24, "validate-the-version-installed-correctly"], [22, "validate-the-version-installed-correctly"], [26, "validate-the-version-installed-correctly"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Kill all containers": [[24, "kill-all-containers"], [22, "kill-all-containers"], [25, "kill-all-containers"], [26, "kill-all-containers"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Some queries use Consistency Level: ALL": [[28, "some-queries-use-consistency-level-all"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"], [26, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"], [26, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"], [26, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y": [[26, "upgrade-guide-scylladb-monitoring-4-x-to-scylladb-monitoring-4-y"]], "Rollback to version 4.x": [[26, "rollback-to-version-4-x"]], "Prepared statements cache eviction": [[40, "prepared-statements-cache-eviction"]], "Using Scylla Monitoring Stack": [[43, "using-scylla-monitoring-stack"]], "System Overload": [[41, "system-overload"]], "The CQL Optimization": [[42, "the-cql-optimization"]], "Prepared Statements": [[42, "prepared-statements"]], "Token Aware": [[42, "token-aware"]], "Paged Queries": [[42, "paged-queries"]], "Reversed CQL Reads": [[42, "reversed-cql-reads"]], "ALLOW FILTERING": [[42, "allow-filtering"]], "Consistency Level": [[42, "consistency-level"]], "Cross DC": [[42, "cross-dc"]], "Cross DC Consistency Level": [[42, "cross-dc-consistency-level"]], "Cross DC read requests": [[42, "cross-dc-read-requests"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "ScyllaDB Monitoring Stack": [[1, "scylladb-monitoring-stack"], [9, "scylladb-monitoring-stack"]], "Minimal Production System Recommendations": [[4, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[4, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[4, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.4/sitemap.xml b/branch-4.4/sitemap.xml new file mode 100644 index 000000000..176e38610 --- /dev/null +++ b/branch-4.4/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlReverseOrder.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.4/troubleshooting/index.html b/branch-4.4/troubleshooting/index.html new file mode 100644 index 000000000..5f0f9da49 --- /dev/null +++ b/branch-4.4/troubleshooting/index.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Troubleshooting Guide for Scylla Monitoring Stack

                            +
                            +
                            +

                            Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/troubleshooting/monitor-troubleshoot.html b/branch-4.4/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..8449dd810 --- /dev/null +++ b/branch-4.4/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,887 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Troubleshoot Scylla Monitoring Stack

                            +

                            This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                            +
                            +

                            Problem

                            +
                            +

                            Scylla-Manager 2.2 with Duplicate information

                            +

                            Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                            +
                              +
                            • For Manager server: from 56090 to 5090

                            • +
                            • For Manager Agent: from 56090 to 5090

                            • +
                            +

                            For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                            +

                            However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                            +

                            The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                            +

                            Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                            +
                            +
                            +

                            A Container Fails To Start

                            +

                            When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                            +
                            Wait for Prometheus container to start........Error: Prometheus container failed to start
                            +
                            +
                            +

                            Should this happen, check the Docker logs for more information.

                            +
                            docker logs aprom
                            +
                            +
                            +

                            Usually the reason for the failure is described in the logs.

                            +
                            +
                            +

                            Files And Directory Permissions

                            +
                            +

                            Note

                            +

                            Avoid running Docker containers as root.

                            +
                            +

                            The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                            +

                            If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                            +
                            +

                            Note

                            +

                            If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                            +
                            +

                            For example if your Prometheus data directory is /prom-data and you are using centos user

                            +
                            ls -la /|grep prom-data
                            +
                            +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                            +
                            +sudo chown -R centos:centos /prom-data
                            +
                            +ls -la /|grep prom-data
                            +
                            +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                            +
                            +
                            +
                            +
                            +

                            No Data Points

                            +

                            No data points on all data charts.

                            +
                            +

                            Solution

                            +

                            If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                            +
                              +
                            1. Login to the Prometheus console:

                            2. +
                            3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                            4. +
                            5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                            6. +
                            +
                            +
                              +
                            • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                            • +
                            • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                            • +
                            • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                            • +
                            +
                            +

                            For example:

                            +
                            ./start-all.sh -v 3.1
                            +
                            +
                            +

                            More on start-all.sh options.

                            +
                            +
                            +
                            +

                            Grafana Chart Shows Error (!) Sign

                            +

                            Run this procedure on the Scylla Monitoring Stack server.

                            +

                            If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                            +
                            +

                            Solution

                            +

                            On the Scylla Monitoring Stack server:

                            +
                              +
                            1. Check Prometheus is running using docker ps.

                            2. +
                            +
                              +
                            • If it is not running check the prometheus.yml for errors.

                            • +
                            +

                            For example:

                            +
                            CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                            +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                            +
                            +
                            +
                              +
                            • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                            • +
                            +
                            +
                            +
                            +

                            Grafana Shows Server Level Metrics, but not Scylla Metrics

                            +

                            Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                            +
                            +

                            Solution

                            +
                              +
                            • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                            • +
                            +

                            For example

                            +
                            curl 172.17.0.2:9180/metrics
                            +
                            +
                            +
                            +
                            +
                            +

                            Grafana Shows Scylla Metrics, but not Server Level Metrics

                            +

                            Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                            +
                            +

                            Solution

                            +

                            1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                            +
                              +
                            1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                            2. +
                            +
                            +
                            +

                            Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                            +

                            While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                            +

                            If the node_exporter service is not starting it may need to be updated manually.

                            +

                            Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                            +
                            +
                            +
                            +

                            Latencies Graphs Are empty

                            +

                            Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                            +

                            During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                            +

                            Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                            +

                            If only the latency graphs are missing, it is because of missing recording rules.

                            +

                            This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                            +

                            If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                            +
                            +
                            +

                            Reducing the total number of metrics

                            +

                            In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                            +
                            +

                            Remove interrupts from node_exporter

                            +

                            By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                            +
                            +
                            +
                            +

                            Working with Wireshark

                            +

                            No metrics shown in the Scylla Monitoring Stack.

                            +
                              +
                            1. Install wireshark

                            2. +
                            +

                            2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                            +

                            For example:

                            +
                            tshark -i eth0 -f "dst port 9180"
                            +
                            +
                            +

                            Capture from Scylla node towards Scylla Monitoring Stack server.

                            +

                            In this example, Scylla is running.

                            +
                            Monitor ip        Scylla node ip
                            +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                            +
                            +
                            +

                            In this example, Scylla is not running

                            +
                            Monitor ip        Scylla node ip
                            +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                            +
                            +
                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/index.html b/branch-4.4/upgrade/index.html new file mode 100644 index 000000000..0920d8a75 --- /dev/null +++ b/branch-4.4/upgrade/index.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Scylla Monitoring Stack

                            +
                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..9c7c9e64b --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,795 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                            +

                            Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                            +
                            +

                            Upgrade Procedure

                            +
                            +

                            1. Upgrade to the latest 1.x version

                            +

                            Before starting the upgrade procedure, make sure you are running the latest 1.x version

                            +
                            +
                            +

                            2. Install the new monitoring stack

                            +
                              +
                            1. Download the 2.x version from the release page.

                            2. +
                            3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                            4. +
                            5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                              +
                                +
                              • scylla_servers.yml

                              • +
                              • scylla_manager_servers.yml

                              • +
                              • node_exporter_servers.yml

                              • +
                              +
                            6. +
                            7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                            8. +
                            +
                            ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                            +
                            +
                            +
                            +

                            Note

                            +

                            Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                            +
                            +

                            While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                            +
                            ./kill-all.sh -g 3001 -p 9091 -m 9094
                            +
                            +
                            +
                            +

                            Validation

                            +

                            Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                            +
                            +
                            +
                            +

                            3. Alerting Rules

                            +

                            Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                            +
                            +
                            +

                            4. Moving to Prometheus 2.x

                            +

                            Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                            +

                            Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                            +
                            +

                            a. Set the old system

                            +

                            The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                            +
                              +
                            • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                            • +
                            • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                            • +
                            +
                            +

                            Note

                            +

                            After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                            +
                            +
                            +
                            +

                            b. Set the new system

                            +

                            The following step will allow the new monitoring system to read historical metrics from the old system.

                            +
                              +
                            • In the Prometheus prometheus.yml.template file add the following at the end:

                            • +
                            +
                            remote_read:
                            +  - url: "http://{ip}:9111/api/v1/read"
                            +
                            +
                            +

                            Where {ip} is the ip of the old system.

                            +
                              +
                            • restart the new stack

                            • +
                            +
                            +
                            +
                            +

                            Validate the upgrade

                            +

                            You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                            +
                            +
                            +
                            +

                            Rollback

                            +

                            In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..e424ddc15 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,789 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                            +
                            +

                            Upgrade Procedure

                            +

                            We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                            +

                            Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                            +
                            +

                            Install 2.y (The new version)

                            +
                            wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                            +unzip scylla-monitoring-2.y.zip
                            +cd scylla-monitoring-scylla-monitoring-2.y/
                            +
                            +
                            +

                            Replace “y” with the new minor release number, for example, 2.1.zip

                            +
                            +
                            +

                            Setting the server’s files

                            +

                            Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                            +
                            cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                            +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                            +
                            +
                            +
                            +
                            +

                            Validate the new version is running the correct version

                            +

                            Starting from Scylla-Monitoring version 2.2, you can run:

                            +
                            ./start-all.sh --version
                            +
                            +
                            +

                            To validate the Scylla-Monitoring version.

                            +
                            +
                            +

                            Validate the version installed correctly

                            +

                            To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                            +
                            ./start-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            Browse to http://{ip}:9091 +And check the Grafana dashboard

                            +

                            Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                            +
                            +

                            Caution

                            +

                            Important: do not use the local dir flag when testing!

                            +
                            +

                            When you are satisfied with the data in the dashboard, you can shut down the containers.

                            +
                            +

                            Caution

                            +

                            Important: Do not kill the 2.x version that is currently running.

                            +
                            +

                            Use the following command to kill the containers:

                            +
                            ./kill-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            You can start and stop the new 2.y version while testing.

                            +
                            +
                            +

                            Move to version 2.y (the new version)

                            +

                            Note: migrating will cause a few seconds of blackout in the system.

                            +

                            We assume that you are using external volume to store the metrics data.

                            +
                            +

                            Kill all containers

                            +

                            Follow the instruction on how to kill the 2.y version when in testing mode.

                            +

                            To kill the 2.x version containers, run:

                            +
                            ./kill-all.sh
                            +
                            +
                            +

                            Start version 2.y in normal mode

                            +

                            From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                            +
                            ./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +

                            Point your browser to http://{ip}:3000 and see that the data is there.

                            +
                            +
                            +
                            +

                            Rollback to version 2.x

                            +

                            To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                            +

                            To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                            +
                            ./kill-all.sh
                            +cd /path/to/scylla-grafana-2.x/
                            +./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +
                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..7a594c4b0 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,753 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                            +

                            Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                            +
                            +

                            Upgrade Procedure

                            +
                            +

                            1. Validate node_exporter version

                            +

                            Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                            +

                            If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                            +
                            +
                            +

                            2. Install the new monitoring stack

                            +
                              +
                            1. Download the 3.x version from the release page.

                            2. +
                            3. Unzip it into a different directory.

                            4. +
                            5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                              +
                                +
                              • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                              • +
                              • scylla_manager_servers.yml

                              • +
                              +
                              +
                              +

                              Note

                              +

                              The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                              +
                              +
                              +
                            6. +
                            7. Stop the old monitoring stack

                              +
                              +
                              ./kill-all.sh
                              +
                              +
                              +
                              +
                            8. +
                            9. Start the new monitoring stack

                              +
                              +
                              ./start-all.sh -d /prometheus-data-path
                              +
                              +
                              +
                              +
                            10. +
                            +
                            +
                            +

                            Validate the upgrade

                            +

                            You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                            +

                            Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                            +
                            +
                            +
                            +

                            Rollback

                            +

                            To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..21a5d4736 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,797 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                            +
                            +

                            Upgrade Procedure

                            +

                            We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                            +

                            Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                            +
                            +

                            Install 3.y (The new version)

                            +
                            wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                            +unzip scylla-monitoring-3.y.zip
                            +cd scylla-monitoring-scylla-monitoring-3.y/
                            +
                            +
                            +

                            Replace “y” with the new minor release number, for example, 3.0.1.zip

                            +
                            +
                            +

                            Setting the server’s files

                            +

                            Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                            +
                            cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                            +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                            +
                            +
                            +
                            +
                            +

                            Validate the new version is running the correct version

                            +

                            Starting from Scylla-Monitoring version 2.2, you can run:

                            +
                            ./start-all.sh --version
                            +
                            +
                            +

                            To validate the Scylla-Monitoring version.

                            +
                            +
                            +

                            Validate the version installed correctly

                            +

                            To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                            +
                            ./start-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            Browse to http://{ip}:9091 +And check the Grafana dashboard

                            +

                            Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                            +
                            +

                            Caution

                            +

                            Important: do not use the local dir flag when testing!

                            +
                            +

                            When you are satisfied with the data in the dashboard, you can shut down the containers.

                            +
                            +

                            Caution

                            +

                            Important: Do not kill the 3.x version that is currently running.

                            +
                            +
                            +
                            +

                            Killing the new 3.y Monitoring stack in testing mode

                            +

                            Use the following command to kill the containers:

                            +
                            ./kill-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            You can start and stop the new 3.y version while testing.

                            +
                            +
                            +

                            Move to version 3.y (the new version)

                            +

                            Note: migrating will cause a few seconds of blackout in the system.

                            +

                            We assume that you are using external volume to store the metrics data.

                            +
                            +

                            Kill all containers

                            +

                            At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                            +

                            Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                            +

                            kill the older 3.x version containers by running:

                            +
                            ./kill-all.sh
                            +
                            +
                            +

                            Start version 3.y in normal mode

                            +

                            From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                            +
                            ./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +

                            Point your browser to http://{ip}:3000 and see that the data is there.

                            +
                            +
                            +
                            +

                            Rollback to version 3.x

                            +

                            To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                            +

                            To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                            +
                            ./kill-all.sh
                            +cd /path/to/scylla-grafana-3.x/
                            +./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +
                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..20548b898 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,940 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                            +
                            +

                            Upgrade Procedure

                            +

                            We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                            +

                            Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                            +
                            +

                            Install 4.y (The new version)

                            +
                            wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                            +unzip scylla-monitoring-4.y.zip
                            +cd scylla-monitoring-scylla-monitoring-4.y/
                            +
                            +
                            +

                            Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                            +
                            +
                            +

                            Setting the server’s files

                            +

                            Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                            +
                            cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                            +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                            +
                            +
                            +
                            +
                            +

                            Validate the new version is running the correct version

                            +

                            run:

                            +
                            ./start-all.sh --version
                            +
                            +
                            +

                            To validate the Scylla-Monitoring version.

                            +
                            +
                            +
                            +

                            Running in test mode

                            +

                            This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                            +
                            +

                            Running second monitoring stack

                            +

                            We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                            +
                            ./start-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            Browse to http://{ip}:9091 and check the Grafana dashboard.

                            +

                            Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                            +
                            +

                            Caution

                            +

                            Important: do not use the local dir flag when testing!

                            +
                            +

                            When you are satisfied with the data in the dashboard, you can shut down the containers.

                            +
                            +

                            Caution

                            +

                            Important: Do not kill the 3.x version that is currently running!

                            +
                            +
                            +
                            +

                            Killing the new 4.y Monitoring stack in testing mode

                            +

                            Use the following command to kill the containers:

                            +
                            ./kill-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            You can start and stop the new 4.y version while testing.

                            +
                            +
                            +
                            +

                            Migrating

                            +
                            +

                            Move to version 4.y (the new version)

                            +

                            Note: migrating will cause a few seconds of blackout in the system.

                            +

                            We assume that you are using external volume to store the metrics data.

                            +
                            +

                            Backup

                            +

                            We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                            +
                            +
                            +

                            Kill all containers

                            +

                            At this point you have two monitoring stacks installed with the older version running.

                            +

                            If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                            +

                            kill the older 3.x version containers by running:

                            +
                            ./kill-all.sh
                            +
                            +
                            +

                            Start version 4.y in normal mode

                            +

                            From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                            +
                            ./start-all.sh -d /path/to/copy/data/dir
                            +
                            +
                            +

                            Point your browser to http://{ip}:3000 and see that the data is there.

                            +
                            +
                            +
                            +

                            Rollback to version 3.x

                            +

                            To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                            +

                            To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                            +
                            ./kill-all.sh
                            +cd /path/to/scylla-grafana-3.x/
                            +./start-all.sh -d /path/to/original/data/dir
                            +
                            +
                            +
                            +
                            +
                            +

                            Post-installation: Metrics back-filling

                            +

                            Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                            +

                            For example, this is a recording rule that calculates the p99 write latency:

                            +
                            - record: wlatencyp99
                            +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                            +  labels:
                            +    by: "instance,shard"
                            +
                            +
                            +

                            For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                            +

                            Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                            +
                            +
                            +

                            Note

                            +

                            If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                            +
                            +
                            +
                            +../_images/before-backfilling.png +
                            +

                            This is an example of missing latency graph

                            +
                            +
                            +

                            The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                            +

                            For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                            +

                            In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                            +

                            The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                            +
                            +

                            Determine the backfilling period

                            +

                            When you run the backfilling process you need to determine the start time and end time.

                            +
                            +

                            Determine the start time

                            +

                            The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                            +

                            If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                            +

                            For the rest of this example, we will assume that your retention time is 360 days.

                            +
                            +
                            +

                            Determine the end time

                            +

                            Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                            +

                            If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                            +

                            That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                            +

                            The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                            +
                            +
                            +
                            +

                            Backfilling Process

                            +
                            +

                            backup

                            +

                            If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                            +

                            To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                            +
                            +
                            +

                            Restart the monitoring stack

                            +

                            You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                            +

                            -b "--storage.tsdb.allow-overlapping-blocks"

                            +
                            +
                            +

                            Create the data files

                            +

                            We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                            +

                            The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                            +

                            Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                            +
                            docker exec -it aprom sh
                            +cd /prometheus/data/
                            +promtool tsdb create-blocks-from rules \
                            +--start $start \
                            +--end $end \
                            +--url http://localhost:9090 \
                            +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                            +
                            +
                            +

                            It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                            +
                            +
                            +

                            Note

                            +

                            Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                            +
                            +
                            +
                            +
                            +

                            Copy the data files

                            +

                            Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                            +

                            Copy the data files to the Prometheus directory:

                            +
                            cp data/* .
                            +
                            +
                            +

                            The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                            +

                            Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                            +
                            +../_images/after-backfilling.jpg +
                            +

                            Un example: after loading half of the data

                            +
                            +
                            +
                            +
                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/branch-4.4/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..f7d590935 --- /dev/null +++ b/branch-4.4/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,798 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y

                            +

                            This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x to 4.y, for example, between 4.0 to 4.0.1.

                            +
                            +

                            Upgrade Procedure

                            +

                            We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                            +

                            Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                            +
                            +

                            Install 4.y (The new version)

                            +
                            wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                            +unzip scylla-monitoring-4.y.zip
                            +cd scylla-monitoring-scylla-monitoring-4.y/
                            +
                            +
                            +

                            Replace “y” with the new minor release number, for example, 4.0.1.zip

                            +
                            +
                            +

                            Setting the server’s files

                            +

                            Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                            +
                            cp /path/to/monitoring/4.x/prometheus/scylla_servers.yml prometheus/
                            +cp /path/to/monitoring/4.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                            +
                            +
                            +
                            +
                            +

                            Validate the new version is running the correct version

                            +

                            Run:

                            +
                            ./start-all.sh --version
                            +
                            +
                            +

                            To validate the Scylla-Monitoring version.

                            +
                            +
                            +

                            Validate the version installed correctly

                            +

                            To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x) stack.

                            +
                            ./start-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            Browse to http://{ip}:9091 +And check the Grafana dashboard

                            +

                            Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                            +
                            +

                            Caution

                            +

                            Important: do not use the local dir flag when testing!

                            +
                            +

                            When you are satisfied with the data in the dashboard, you can shut down the containers.

                            +
                            +

                            Caution

                            +

                            Important: Do not kill the 4.x version that is currently running.

                            +
                            +
                            +
                            +

                            Killing the new 4.y Monitoring stack in testing mode

                            +

                            Use the following command to kill the containers:

                            +
                            ./kill-all.sh -p 9091 -g 3001 -m 9095
                            +
                            +
                            +

                            You can start and stop the new 4.y version while testing.

                            +
                            +
                            +

                            Move to version 4.y (the new version)

                            +

                            Note: migrating will cause a few seconds of blackout in the system.

                            +

                            We assume that you are using external volume to store the metrics data.

                            +
                            +

                            Kill all containers

                            +

                            At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                            +

                            Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section

                            +

                            kill the older 4.x version containers by running:

                            +
                            ./kill-all.sh
                            +
                            +
                            +

                            Start version 4.y in normal mode

                            +

                            From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                            +
                            ./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +

                            Point your browser to http://{ip}:3000 and see that the data is there.

                            +
                            +
                            +
                            +

                            Rollback to version 4.x

                            +

                            To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                            +

                            To rollback to version 4.x after you completed the moving to version 4.y (as shown above). +Run:

                            +
                            ./kill-all.sh
                            +cd /path/to/scylla-grafana-4.x/
                            +./start-all.sh -d /path/to/data/dir
                            +
                            +
                            +
                            +
                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.4/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..b3e11dfbf --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries use ALLOW FILTERING

                            +

                            Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                            +

                            These kinds of queries can create a bigger load on Scylla, and should be used with care.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlCLAll.html b/branch-4.4/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..61098945e --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries use Consistency Level: ALL

                            +

                            Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                            +

                            Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                            +

                            Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlCLAny.html b/branch-4.4/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..33f2d6618 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries use Consistency Level: ANY

                            +

                            Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                            +

                            Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.4/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..d6c5df765 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries are not token-aware

                            +

                            Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                            +

                            Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlNonPaged.html b/branch-4.4/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..5c9ecb0a7 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some SELECT queries are non-paged

                            +

                            By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                            +
                            +

                            Blog-post Links

                            +

                            https://www.scylladb.com/2018/07/13/efficient-query-paging/

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.4/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..4801f2813 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries are non-prepared

                            +

                            Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/cqlReverseOrder.html b/branch-4.4/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..a6cfad6d7 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some queries use reverse order | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Some queries use reverse order

                            +

                            Scylla supports a “cluster key” as a way to order (sort) rows in the same partition.

                            +

                            Querying with an order which is different from the defined order in the CLUSTERING ORDER BY is inefficient and more resource-consuming. Reverse Queries should be avoided if possible

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/heavyCompaction.html b/branch-4.4/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..a1f25c17d --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Compaction takes lots of memory and CPU

                            +

                            ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                            +

                            If this is the case, you can do one of the following:

                            +
                              +
                            • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                              +
                              +
                                +
                              • In the scylla.yml configuration file: compaction_static_shares: 100

                              • +
                              • In the command line when starting ScyllaDB: --compaction-static-shares 100

                              • +
                              +
                              +

                              You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                              +
                            • +
                            • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                            • +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/index.html b/branch-4.4/use-monitoring/advisor/index.html new file mode 100644 index 000000000..9a3c9fcac --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/index.html @@ -0,0 +1,709 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Scylla Monitoring Stack Advisor

                            +
                            +
                            +

                            The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                            +
                            +

                            The Advisor section

                            +
                            +../../_images/advisor_panel.png +
                            +

                            The Advisor section

                            +
                            +
                            +

                            The Advisor section is located on the Overview dashboard and consists of two parts:

                            +

                            On the left, is the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                            +

                            For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                            +

                            On the right, is the system balance section. This section notifies you about an imbalance between shards or nodes. An imbalanced system may indicate a potential problem.

                            +

                            For example, when a single, hot partition gets most of the requests, making one shard a bottleneck, the balance section will indicate that the latency and cache hits are imbalanced between shards.

                            +

                            Each Advisor issue is explained in detail:

                            + +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/nodeCLErrors.html b/branch-4.4/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..b7f6c3d8e --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Some operation failed due to unsatisfied consistency level

                            +

                            ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                            +

                            For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                            +

                            When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/nodeIOErrors.html b/branch-4.4/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..b2a8417e9 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            I/O Errors can indicate a node with a faulty disk

                            +

                            I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.4/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..63f7f6300 --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Some operations failed on the replica side

                            +

                            ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                            +

                            An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.4/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..259047d2f --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            CQL queries are not balanced among shards

                            +

                            For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                            +

                            There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                            +
                            +

                            Blog post link

                            +

                            https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.4/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..ed9a011af --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            Prepared statements cache eviction

                            +

                            Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                            +
                              +
                            • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                            • +
                            • The prepared statements cache might be too small for the number of prepared statements.

                            • +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/advisor/systemOverload.html b/branch-4.4/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..b16fc232b --- /dev/null +++ b/branch-4.4/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            System Overload

                            +

                            There could be multiple indications that a system is overloaded:

                            +
                              +
                            • Timeouts

                            • +
                            • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                            • +
                            • CPU at 100% when no background process (like compaction or repair) runs.

                            • +
                            • Ques are getting filled.

                            • +
                            +

                            If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/cql-optimization.html b/branch-4.4/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..dd4c131ba --- /dev/null +++ b/branch-4.4/use-monitoring/cql-optimization.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + + + +
                            +

                            The CQL Optimization

                            +

                            The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                            +
                            +../_images/cql_optimization_master.png +
                            +

                            The CQL Dashboard

                            +
                            +
                            +

                            The upper part of the dashboard holds CQL related metrics.

                            +

                            The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                            +
                            +

                            Note

                            +

                            Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                            +
                            +

                            The following sections describe each of the dashboard’s panel

                            +
                            +

                            Prepared Statements

                            +

                            Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                            +

                            Using prepared statements has the following benefits:

                            +
                              +
                            • The database only needs to parse the query once

                            • +
                            • The driver can route the query to the right node

                            • +
                            • Using place-holders and values is safer and prevents CQL-Injection

                            • +
                            +

                            The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                            +

                            The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                            +
                            +
                            +

                            Token Aware

                            +

                            Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                            +

                            Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                            +

                            The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                            +

                            The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                            +
                            +
                            +

                            Paged Queries

                            +

                            By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                            +

                            The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                            +

                            The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                            +
                            +
                            +

                            Reversed CQL Reads

                            +

                            Scylla supports compound primary keys with a clustering column, this kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                            +

                            Querying with an order different than the order the CLUSTERING ORDER BY was defined is inefficient and should be avoided.

                            +

                            For example, look at the following table:

                            +
                            CREATE TABLE ks1.table_demo (
                            +   category text,
                            +   type int,
                            +   PRIMARY KEY (category, type))
                            +WITH CLUSTERING ORDER BY (type DESC);
                            +
                            +
                            +

                            The following query uses reverse order:

                            +
                            select * from ks1.table_demo where category='cat1' order by type ASC;
                            +
                            +
                            +

                            The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                            +

                            The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                            +
                            +
                            +

                            ALLOW FILTERING

                            +

                            Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                            +

                            These kinds of queries can create a big load on the system, and should be used with care.

                            +

                            The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                            +

                            The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                            +

                            The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                            +

                            The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                            +

                            The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                            +
                            +
                            +

                            Consistency Level

                            +

                            Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                            +

                            The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                            +

                            Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                            +

                            The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                            +

                            The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                            +

                            The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                            +

                            The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                            +
                            +
                            +

                            Cross DC

                            +

                            Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                            +
                            +
                            +

                            Cross DC Consistency Level

                            +

                            Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                            +
                            +
                            +

                            Cross DC read requests

                            +
                            +

                            Note

                            +

                            The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                            +
                            +

                            In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                            +

                            The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                            +
                            +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.4/use-monitoring/index.html b/branch-4.4/use-monitoring/index.html new file mode 100644 index 000000000..f64c5f876 --- /dev/null +++ b/branch-4.4/use-monitoring/index.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                            + + + +
                            +
                            + Menu +
                            +
                            +
                            +
                            +
                            + + +
                            +

                            Caution

                            +

                            + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                            +
                            + + + +
                            + +
                            + +
                            +

                            Using Scylla Monitoring Stack

                            +
                            +
                            +

                            There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                            + +
                            + + +
                            + + + + + + + +
                            + +
                            + + + + +
                            + + + + + + + \ No newline at end of file diff --git a/branch-4.5/.buildinfo b/branch-4.5/.buildinfo new file mode 100644 index 000000000..94b97a4a7 --- /dev/null +++ b/branch-4.5/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 2f1609d5332574f963fcfb306cda2b21 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.5/.doctrees/common/monitor-description.doctree b/branch-4.5/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..6f9d7e1a5 Binary files /dev/null and b/branch-4.5/.doctrees/common/monitor-description.doctree differ diff --git a/branch-4.5/.doctrees/environment.pickle b/branch-4.5/.doctrees/environment.pickle new file mode 100644 index 000000000..892eb9b35 Binary files /dev/null and b/branch-4.5/.doctrees/environment.pickle differ diff --git a/branch-4.5/.doctrees/index.doctree b/branch-4.5/.doctrees/index.doctree new file mode 100644 index 000000000..abd6ecb91 Binary files /dev/null and b/branch-4.5/.doctrees/index.doctree differ diff --git a/branch-4.5/.doctrees/install/docker-compose.doctree b/branch-4.5/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..1e1504fe7 Binary files /dev/null and b/branch-4.5/.doctrees/install/docker-compose.doctree differ diff --git a/branch-4.5/.doctrees/install/index.doctree b/branch-4.5/.doctrees/install/index.doctree new file mode 100644 index 000000000..570aad4be Binary files /dev/null and b/branch-4.5/.doctrees/install/index.doctree differ diff --git a/branch-4.5/.doctrees/install/min-prod-hw.doctree b/branch-4.5/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..d5d0b367e Binary files /dev/null and b/branch-4.5/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.5/.doctrees/install/monitor-without-docker.doctree b/branch-4.5/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..fedece9f2 Binary files /dev/null and b/branch-4.5/.doctrees/install/monitor-without-docker.doctree differ diff --git a/branch-4.5/.doctrees/install/monitoring-stack.doctree b/branch-4.5/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..03f6d86c7 Binary files /dev/null and b/branch-4.5/.doctrees/install/monitoring-stack.doctree differ diff --git a/branch-4.5/.doctrees/install/start-all.doctree b/branch-4.5/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..34a672c61 Binary files /dev/null and b/branch-4.5/.doctrees/install/start-all.doctree differ diff --git a/branch-4.5/.doctrees/install/thanos.doctree b/branch-4.5/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..d3ecb88db Binary files /dev/null and b/branch-4.5/.doctrees/install/thanos.doctree differ diff --git a/branch-4.5/.doctrees/intro.doctree b/branch-4.5/.doctrees/intro.doctree new file mode 100644 index 000000000..c4f371383 Binary files /dev/null and b/branch-4.5/.doctrees/intro.doctree differ diff --git a/branch-4.5/.doctrees/procedures/alerts/alerting.doctree b/branch-4.5/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..98d03bf6a Binary files /dev/null and b/branch-4.5/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.5/.doctrees/procedures/alerts/index.doctree b/branch-4.5/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..5224ae68e Binary files /dev/null and b/branch-4.5/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.5/.doctrees/procedures/datadog/index.doctree b/branch-4.5/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..196482996 Binary files /dev/null and b/branch-4.5/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.5/.doctrees/procedures/index.doctree b/branch-4.5/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..2034a74cc Binary files /dev/null and b/branch-4.5/.doctrees/procedures/index.doctree differ diff --git a/branch-4.5/.doctrees/procedures/updating-dashboard.doctree b/branch-4.5/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..5044258ad Binary files /dev/null and b/branch-4.5/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/branch-4.5/.doctrees/reference/index.doctree b/branch-4.5/.doctrees/reference/index.doctree new file mode 100644 index 000000000..44a00d09d Binary files /dev/null and b/branch-4.5/.doctrees/reference/index.doctree differ diff --git a/branch-4.5/.doctrees/reference/matrix.doctree b/branch-4.5/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..87465a62c Binary files /dev/null and b/branch-4.5/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.5/.doctrees/reference/monitoring-apis.doctree b/branch-4.5/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..898a8fd46 Binary files /dev/null and b/branch-4.5/.doctrees/reference/monitoring-apis.doctree differ diff --git a/branch-4.5/.doctrees/troubleshooting/index.doctree b/branch-4.5/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..ceebe7e18 Binary files /dev/null and b/branch-4.5/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.5/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/branch-4.5/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..d157a562f Binary files /dev/null and b/branch-4.5/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/index.doctree b/branch-4.5/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..acea39f45 Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..b04fb774d Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..d0d8bdebf Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..934468d1e Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..17d6b9ebe Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..73ed116fb Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..d7495e4a7 Binary files /dev/null and b/branch-4.5/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..e9ee8ee69 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..780b7ee29 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..e9557a2b1 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..6240df335 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..1fc0c3637 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..c4a65b504 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..a56ed2b1c Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..924503321 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..e252d1f25 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..c3abe336a Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..00a16b681 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..cea66455a Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..25c55a511 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.5/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..43c6866d5 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/cql-optimization.doctree b/branch-4.5/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..fe6dfc422 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/branch-4.5/.doctrees/use-monitoring/index.doctree b/branch-4.5/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..a4d5b83e8 Binary files /dev/null and b/branch-4.5/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.5/.nojekyll b/branch-4.5/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.5/404.html b/branch-4.5/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.5/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                            +

                            404

                            +

                            The ScyllaDB monster ate your page!

                            +

                            + Home +

                            +
                            + + + \ No newline at end of file diff --git a/branch-4.5/CNAME b/branch-4.5/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.5/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.5/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.5/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..3e85b60ab --- /dev/null +++ b/branch-4.5/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,576 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" diff --git a/branch-4.5/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.5/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.5/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.5/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.5/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/branch-4.5/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.5/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.5/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/branch-4.5/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.5/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/branch-4.5/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/branch-4.5/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/branch-4.5/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.5/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/branch-4.5/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.5/_images/1.png b/branch-4.5/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.5/_images/1.png differ diff --git a/branch-4.5/_images/2.png b/branch-4.5/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.5/_images/2.png differ diff --git a/branch-4.5/_images/3.png b/branch-4.5/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.5/_images/3.png differ diff --git a/branch-4.5/_images/advisor_panel.png b/branch-4.5/_images/advisor_panel.png new file mode 100644 index 000000000..89b9a5950 Binary files /dev/null and b/branch-4.5/_images/advisor_panel.png differ diff --git a/branch-4.5/_images/after-backfilling.jpg b/branch-4.5/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.5/_images/after-backfilling.jpg differ diff --git a/branch-4.5/_images/alertmanager.png b/branch-4.5/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.5/_images/alertmanager.png differ diff --git a/branch-4.5/_images/before-backfilling.png b/branch-4.5/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.5/_images/before-backfilling.png differ diff --git a/branch-4.5/_images/cql_optimization_master.png b/branch-4.5/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.5/_images/cql_optimization_master.png differ diff --git a/branch-4.5/_images/datadog.png b/branch-4.5/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.5/_images/datadog.png differ diff --git a/branch-4.5/_images/grafana.png b/branch-4.5/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.5/_images/grafana.png differ diff --git a/branch-4.5/_images/monitor.png b/branch-4.5/_images/monitor.png new file mode 100644 index 000000000..cf691ecb3 Binary files /dev/null and b/branch-4.5/_images/monitor.png differ diff --git a/branch-4.5/_images/monitoring_stack.png b/branch-4.5/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.5/_images/monitoring_stack.png differ diff --git a/branch-4.5/_images/monitoring_stack1.png b/branch-4.5/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.5/_images/monitoring_stack1.png differ diff --git a/branch-4.5/_sources/common/monitor-description.rst.txt b/branch-4.5/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.5/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.5/_sources/index.rst.txt b/branch-4.5/_sources/index.rst.txt new file mode 100644 index 000000000..3dbe94edd --- /dev/null +++ b/branch-4.5/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.5/_sources/install/docker-compose.rst.txt b/branch-4.5/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.5/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.5/_sources/install/index.rst.txt b/branch-4.5/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/branch-4.5/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.5/_sources/install/min-prod-hw.rst.txt b/branch-4.5/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.5/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                            + + + + + + + + + + + +
                            # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                            00
                            + +
                            + \ No newline at end of file diff --git a/branch-4.5/_sources/install/monitor-without-docker.rst.txt b/branch-4.5/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..d0be59164 --- /dev/null +++ b/branch-4.5/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                            `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configurtion`_. + +.. _`grafana configurtion`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.5/_sources/install/monitoring-stack.rst.txt b/branch-4.5/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..0640b50c8 --- /dev/null +++ b/branch-4.5/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,409 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                            `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.5 + - 2.47.1 + - 10.1.5 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.5/_sources/install/start-all.rst.txt b/branch-4.5/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..4407b5495 --- /dev/null +++ b/branch-4.5/_sources/install/start-all.rst.txt @@ -0,0 +1,105 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.5/_sources/install/thanos.rst.txt b/branch-4.5/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.5/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.5/_sources/intro.rst.txt b/branch-4.5/_sources/intro.rst.txt new file mode 100644 index 000000000..78481f6c3 --- /dev/null +++ b/branch-4.5/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.5/_sources/procedures/alerts/alerting.rst.txt b/branch-4.5/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..fb829c91c --- /dev/null +++ b/branch-4.5/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,92 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in the `prometheus.rules.yml` file that is located in the prometheus directory. + +Each alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "2" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **2**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.5/_sources/procedures/alerts/index.rst.txt b/branch-4.5/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.5/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.5/_sources/procedures/datadog/index.rst.txt b/branch-4.5/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bcc4e9b7 --- /dev/null +++ b/branch-4.5/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,68 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non Scylla Cloud users, download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Cloud users, skip this step, it's been take care for by the cloud. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.5/_sources/procedures/index.rst.txt b/branch-4.5/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..76a24002a --- /dev/null +++ b/branch-4.5/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.5/_sources/procedures/updating-dashboard.rst.txt b/branch-4.5/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.5/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.5/_sources/reference/index.rst.txt b/branch-4.5/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/branch-4.5/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.5/_sources/reference/matrix.rst.txt b/branch-4.5/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..23cb1efa2 --- /dev/null +++ b/branch-4.5/_sources/reference/matrix.rst.txt @@ -0,0 +1,155 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.5/_sources/reference/monitoring-apis.rst.txt b/branch-4.5/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/branch-4.5/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.5/_sources/troubleshooting/index.rst.txt b/branch-4.5/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..fa1b25a10 --- /dev/null +++ b/branch-4.5/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,16 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* You can ask questions and discuss the ScyllaDB Monitoring Stack in the `ScyllaDB community forum `_ and on the `Slack channel `_. \ No newline at end of file diff --git a/branch-4.5/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/branch-4.5/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/branch-4.5/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.5/_sources/upgrade/index.rst.txt b/branch-4.5/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/branch-4.5/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                            +
                            +
                            +
                            Upgrade Scylla Open Source
                            +
                            +
                            + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                            +
                            +
                            diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..71dbb9dbc --- /dev/null +++ b/branch-4.5/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,138 @@ +================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y +================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x to 4.y, for example, between 4.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x version that is currently running. + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x after you completed the moving to version 4.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..f86568a31 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,11 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.5/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.5/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.5/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..06fc98c5f --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,37 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.5/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.5/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.5/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.5/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.5/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.5/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.5/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..28b6d1079 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Ques are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.5/_sources/use-monitoring/cql-optimization.rst.txt b/branch-4.5/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..7ac8b2284 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,155 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +We strongly recommend using use the correct ordering. +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is supported, but not advisable. + + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.5/_sources/use-monitoring/index.rst.txt b/branch-4.5/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/branch-4.5/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.5/_static/basic.css b/branch-4.5/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.5/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.5/_static/check-solid.svg b/branch-4.5/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.5/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.5/_static/clipboard.min.js b/branch-4.5/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.5/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.5/_static/copybutton.css b/branch-4.5/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.5/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                            Short

                            + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.5/_static/copybutton.js b/branch-4.5/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.5/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.5/_static/copybutton_funcs.js b/branch-4.5/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.5/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.5/_static/css/main.css b/branch-4.5/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-4.5/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.5/_static/doctools.js b/branch-4.5/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.5/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.5/_static/documentation_options.js b/branch-4.5/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.5/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.5/_static/file.png b/branch-4.5/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.5/_static/file.png differ diff --git a/branch-4.5/_static/img/banner-background.svg b/branch-4.5/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.5/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.5/_static/img/favicon-228x228.png b/branch-4.5/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.5/_static/img/favicon-228x228.png differ diff --git a/branch-4.5/_static/img/favicon-32x32.png b/branch-4.5/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.5/_static/img/favicon-32x32.png differ diff --git a/branch-4.5/_static/img/favicon.ico b/branch-4.5/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.5/_static/img/favicon.ico differ diff --git a/branch-4.5/_static/img/icons/icon-about-team.svg b/branch-4.5/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.5/_static/img/icons/icon-about-us-m.svg b/branch-4.5/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-about-us.svg b/branch-4.5/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-alternator.svg b/branch-4.5/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-apps.svg b/branch-4.5/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-architecture.svg b/branch-4.5/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.5/_static/img/icons/icon-benchmarks.svg b/branch-4.5/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.5/_static/img/icons/icon-blog.svg b/branch-4.5/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.5/_static/img/icons/icon-careers.svg b/branch-4.5/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.5/_static/img/icons/icon-chevron-left.svg b/branch-4.5/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.5/_static/img/icons/icon-chevron-right.svg b/branch-4.5/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.5/_static/img/icons/icon-circe.svg b/branch-4.5/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-clock.svg b/branch-4.5/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-close.svg b/branch-4.5/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-cloud-docs.svg b/branch-4.5/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-cloud.svg b/branch-4.5/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-comparison.svg b/branch-4.5/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.5/_static/img/icons/icon-contact-us.svg b/branch-4.5/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.5/_static/img/icons/icon-developers-blog.svg b/branch-4.5/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.5/_static/img/icons/icon-docs.svg b/branch-4.5/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.5/_static/img/icons/icon-enterprise-m.svg b/branch-4.5/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-enterprise.svg b/branch-4.5/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-events.svg b/branch-4.5/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.5/_static/img/icons/icon-exclamation.svg b/branch-4.5/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-expand.svg b/branch-4.5/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-forum.svg b/branch-4.5/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-getting-started.svg b/branch-4.5/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-glossary.svg b/branch-4.5/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-home.svg b/branch-4.5/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-infoworld.svg b/branch-4.5/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.5/_static/img/icons/icon-integrations.svg b/branch-4.5/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-knowledge-base.svg b/branch-4.5/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-less.svg b/branch-4.5/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-live-test.svg b/branch-4.5/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.5/_static/img/icons/icon-mail-list.svg b/branch-4.5/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-manager.svg b/branch-4.5/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.5/_static/img/icons/icon-memory-management.svg b/branch-4.5/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.5/_static/img/icons/icon-modeling.svg b/branch-4.5/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-monitoring.svg b/branch-4.5/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.5/_static/img/icons/icon-networking.svg b/branch-4.5/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.5/_static/img/icons/icon-news.svg b/branch-4.5/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.5/_static/img/icons/icon-newsletter.svg b/branch-4.5/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.5/_static/img/icons/icon-nsql-guides.svg b/branch-4.5/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.5/_static/img/icons/icon-open-source.svg b/branch-4.5/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.5/_static/img/icons/icon-operator.svg b/branch-4.5/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-overview.svg b/branch-4.5/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.5/_static/img/icons/icon-partners.svg b/branch-4.5/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.5/_static/img/icons/icon-plus.svg b/branch-4.5/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-pricing.svg b/branch-4.5/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.5/_static/img/icons/icon-release-notes.svg b/branch-4.5/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.5/_static/img/icons/icon-resource-center.svg b/branch-4.5/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.5/_static/img/icons/icon-roadmap.svg b/branch-4.5/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.5/_static/img/icons/icon-search.svg b/branch-4.5/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.5/_static/img/icons/icon-slack.svg b/branch-4.5/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-stack-overflow.svg b/branch-4.5/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.5/_static/img/icons/icon-summit.svg b/branch-4.5/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/icons/icon-support.svg b/branch-4.5/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.5/_static/img/icons/icon-tech-talks.svg b/branch-4.5/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.5/_static/img/icons/icon-testing.svg b/branch-4.5/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.5/_static/img/icons/icon-thumbs-down.svg b/branch-4.5/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-thumbs-up.svg b/branch-4.5/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.5/_static/img/icons/icon-tip.svg b/branch-4.5/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.5/_static/img/icons/icon-training.svg b/branch-4.5/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.5/_static/img/icons/icon-triangle-down.svg b/branch-4.5/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.5/_static/img/icons/icon-university.svg b/branch-4.5/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.5/_static/img/icons/icon-users-blog.svg b/branch-4.5/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.5/_static/img/icons/icon-warning.svg b/branch-4.5/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.5/_static/img/icons/icon-webinars.svg b/branch-4.5/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.5/_static/img/icons/icon-whitepapers.svg b/branch-4.5/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.5/_static/img/icons/icon-workshop.svg b/branch-4.5/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.5/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.5/_static/img/logo-docs.svg b/branch-4.5/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.5/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.5/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.5/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.5/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.5/_static/img/mascots/404.jpg b/branch-4.5/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.5/_static/img/mascots/404.jpg differ diff --git a/branch-4.5/_static/img/mascots/scylla-3monsters.png b/branch-4.5/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.5/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-alternator.svg b/branch-4.5/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.5/_static/img/mascots/scylla-cloud.svg b/branch-4.5/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.5/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.5/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-computer-headset.png b/branch-4.5/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-cup-number-one.png b/branch-4.5/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-docs.svg b/branch-4.5/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.5/_static/img/mascots/scylla-drivers.svg b/branch-4.5/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.5/_static/img/mascots/scylla-enterprise.svg b/branch-4.5/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.5/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.5/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-forklift-migration.png b/branch-4.5/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-gear.png b/branch-4.5/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-hardhat.png b/branch-4.5/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-headband.png b/branch-4.5/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-headset.png b/branch-4.5/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-hearts.png b/branch-4.5/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-looking-down.png b/branch-4.5/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-looking-up.png b/branch-4.5/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.5/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.5/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-manager.svg b/branch-4.5/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.5/_static/img/mascots/scylla-monitor.svg b/branch-4.5/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.5/_static/img/mascots/scylla-movement-fast.png b/branch-4.5/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-movement.png b/branch-4.5/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-onpremise.png b/branch-4.5/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-opensource.svg b/branch-4.5/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.5/_static/img/mascots/scylla-operator.svg b/branch-4.5/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.5/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.5/_static/img/mascots/scylla-plugin.png b/branch-4.5/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-release-mascot.png b/branch-4.5/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-repair.png b/branch-4.5/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-server.png b/branch-4.5/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-sleeping.png b/branch-4.5/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-tall-measure.png b/branch-4.5/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-university.png b/branch-4.5/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-weights.png b/branch-4.5/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-window-cleaning.png b/branch-4.5/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-with-computer-2.png b/branch-4.5/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-with-computer.png b/branch-4.5/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-with-linux.png b/branch-4.5/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.5/_static/img/mascots/scylla-writting.png b/branch-4.5/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.5/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.5/_static/img/menu.svg b/branch-4.5/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.5/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.5/_static/img/scylla-monitor.png b/branch-4.5/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.5/_static/img/scylla-monitor.png differ diff --git a/branch-4.5/_static/js/main.bundle.js b/branch-4.5/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-4.5/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                          • Back
                          • ',backButtonPosition:"top",wrapper:"
                            ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                              "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                              ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                              ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                              ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                              ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                              "],col:[2,"","
                              "],tr:[2,"","
                              "],td:[3,"","
                              "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +

                              ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                              + + +
                              + + + + + +
                              + + +
                              + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/genindex.html b/branch-4.5/genindex.html new file mode 100644 index 000000000..784940511 --- /dev/null +++ b/branch-4.5/genindex.html @@ -0,0 +1,641 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + + + +
                              + + + + + +
                              + + +
                              + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/index.html b/branch-4.5/index.html new file mode 100644 index 000000000..fda93de52 --- /dev/null +++ b/branch-4.5/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              ScyllaDB Monitoring Stack

                              +
                              +
                              +

                              ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                              +_images/monitor.png +

                              The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                              +
                                +
                              • prometheus - collects and stores metrics

                              • +
                              • alertmanager - handles alerts

                              • +
                              • grafana - dashboard server

                              • +
                              +

                              Choose a topic to get started:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/docker-compose.html b/branch-4.5/install/docker-compose.html new file mode 100644 index 000000000..6798973cf --- /dev/null +++ b/branch-4.5/install/docker-compose.html @@ -0,0 +1,813 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Using Docker Compose

                              +

                              Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                              +

                              Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                              +
                              +

                              Warning

                              +

                              docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                              +
                              +
                              +

                              Prerequisite

                              +

                              Make sure you have docker and docker-compose installed.

                              +
                              +
                              +

                              Setting Prometheus

                              +

                              The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                              +

                              You can use ./prometheus-config.sh to generate the file, for example:

                              +
                              ./prometheus-config.sh --compose
                              +
                              +
                              +

                              For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                              +
                              +
                              +

                              Setting Grafana Provisioning

                              +

                              Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                              +
                              +

                              Grafana Data-Source file

                              +

                              Run the following command to update the datasource:

                              +
                              ./grafana-datasource.sh --compose
                              +
                              +
                              +

                              You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                              +
                              +
                              +

                              Grafana Dashboard Load file

                              +

                              To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                              +
                              ./generate-dashboards.sh -t -v 2020.1
                              +
                              +
                              +

                              This command generates the files under: grafana/provisioning/dashboards/

                              +
                              +
                              +
                              +

                              Docker Compose file

                              +

                              You can use the following example as a base for your docker compose.

                              +

                              Pass the following to a file called docker-compose.yml

                              +
                              services:
                              +  alertmanager:
                              +    container_name: aalert
                              +    image: prom/alertmanager:v0.24.0
                              +    ports:
                              +    - 9093:9093
                              +    volumes:
                              +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                              +  grafana:
                              +    container_name: agraf
                              +    environment:
                              +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                              +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                              +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                              +    # This is where you set Grafana security
                              +    - GF_AUTH_BASIC_ENABLED=false
                              +    - GF_AUTH_ANONYMOUS_ENABLED=true
                              +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                              +    - GF_SECURITY_ADMIN_PASSWORD=admin
                              +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                              +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                              +    image: grafana/grafana:9.3.11
                              +    ports:
                              +    - 3000:3000
                              +    user: 1000:1000
                              +    volumes:
                              +    - ./grafana/build:/var/lib/grafana/dashboards
                              +    - ./grafana/plugins:/var/lib/grafana/plugins
                              +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                              +    # Uncomment the following line for grafana persistency
                              +    # - path/to/grafana/dir:/var/lib/grafana
                              +  loki:
                              +    command:
                              +    - --config.file=/mnt/config/loki-config.yaml
                              +    container_name: loki
                              +    image: grafana/loki:2.7.3
                              +    ports:
                              +    - 3100:3100
                              +    volumes:
                              +    - ./loki/rules:/etc/loki/rules
                              +    - ./loki/conf:/mnt/config
                              +  promotheus:
                              +    command:
                              +    - --config.file=/etc/prometheus/prometheus.yml
                              +    container_name: aprom
                              +    image: prom/prometheus:v2.42.0
                              +    ports:
                              +    - 9090:9090
                              +    volumes:
                              +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                              +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                              +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                              +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                              +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                              +    # Uncomment the following line for prometheus persistency 
                              +    # - path/to/data/dir:/prometheus/data
                              +  promtail:
                              +    command:
                              +    - --config.file=/etc/promtail/config.yml
                              +    container_name: promtail
                              +    image: grafana/promtail:2.7.3
                              +    ports:
                              +    - 1514:1514
                              +    - 9080:9080
                              +    volumes:
                              +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                              +version: '3'
                              +
                              +
                              +
                              +

                              Start and Stop

                              +

                              To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/index.html b/branch-4.5/install/index.html new file mode 100644 index 000000000..d474258d5 --- /dev/null +++ b/branch-4.5/install/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Download and Install Scylla Monitoring Stack

                              +
                              +
                              +

                              Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                              +

                              Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/min-prod-hw.html b/branch-4.5/install/min-prod-hw.html new file mode 100644 index 000000000..6fc2ea754 --- /dev/null +++ b/branch-4.5/install/min-prod-hw.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Minimal Production System Recommendations

                              +
                                +
                              • CPU - at least 2 physical cores/ 4vCPUs

                              • +
                              • Memory - 15GB+ DRAM and proportional to the number of cores.

                              • +
                              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                              • +
                              • Network - 1GbE/10GbE preferred

                              • +
                              +
                              +

                              Calculating Prometheus Minimal Disk Space requirement

                              +

                              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                              +

                              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                              +

                              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                              +
                              6 * 16 * 15 * 12MB ~ 16GB
                              +
                              +
                              +

                              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                              +
                              +
                              +

                              Calculating Prometheus Minimal Memory Space requirement

                              +

                              Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                              +

                              For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                              + +
                              + +++++++ + + + +
                              # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                              00
                              + +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/monitor-without-docker.html b/branch-4.5/install/monitor-without-docker.html new file mode 100644 index 000000000..5d1089c00 --- /dev/null +++ b/branch-4.5/install/monitor-without-docker.html @@ -0,0 +1,1156 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Deploying Scylla Monitoring Stack Without Docker

                              +
                              +

                              Introduction

                              +

                              The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                              +

                              Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                              +

                              Scylla Monitoring uses the following components:

                              +
                                +
                              • Alertmanager

                              • +
                              • Grafana Loki

                              • +
                              • Prometheus

                              • +
                              • Grafana

                              • +
                              +

                              The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all componenents.

                              +

                              We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                              +
                              +
                              +

                              Minimal Production System Recommendations

                              +
                                +
                              • CPU - at least 2 physical cores/ 4vCPUs

                              • +
                              • Memory - 15GB+ DRAM and proportional to the number of cores.

                              • +
                              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                              • +
                              • Network - 1GbE/10GbE preferred

                              • +
                              +
                              +

                              Calculating Prometheus Minimal Disk Space requirement

                              +

                              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                              +

                              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                              +

                              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                              +
                              6 * 16 * 15 * 12MB ~ 16GB
                              +
                              +
                              +

                              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                              +
                              +
                              +

                              Calculating Prometheus Minimal Memory Space requirement

                              +

                              Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                              +

                              For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                              + +
                              + +++++++ + + + +
                              # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                              00
                              + +
                              +

                              The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                              +
                              +

                              Note

                              +

                              Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                              +
                              +
                              +
                              +
                              +

                              Install Scylla Monitoring Stack

                              +

                              The following procedure uses a CentOS 7 based instance

                              +
                                +
                              1. Download the latest Scylla Monitoring Stack release.

                              2. +
                              +
                              wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.5.1.tar.gz
                              +
                              +
                              +
                                +
                              1. Open the tar

                              2. +
                              +

                              tar -xvf scylla-monitoring-*.tar.gz

                              +
                              +
                              +

                              Install Alertmanager

                              +

                              Tested with alertmanager 0.22.2 version

                              +
                                +
                              1. Install alertmanager

                              2. +
                              +
                              wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                              +tar -xvf alertmanager-*.linux-amd64.tar.gz
                              +
                              +
                              +
                                +
                              1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                              2. +
                              +

                              For example:

                              +
                              cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.5.1/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                              +
                              +
                              +
                                +
                              1. Start the Alertmanager

                              2. +
                              +

                              For example:

                              +
                              cd alertmanager-0.22.2.linux-amd64
                              +./alertmanager
                              +
                              +
                              +
                                +
                              1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                              2. +
                              +

                              For example:

                              +
                              http://192.168.135.166:9093/
                              +
                              +
                              +../_images/alertmanager.png +
                              +
                              +

                              Install Grafana Loki

                              +

                              Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                              +

                              We recomand using Loki with containers, but you can install it locally as described in Loki installation

                              +

                              You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                              +

                              Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                              +

                              Loki Related files

                              +

                              Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                              +
                              mkdir -p /etc/loki/rules
                              +mkdir -p /etc/loki/config
                              +cp loki/rules/* /etc/loki/rules
                              +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                              +
                              +
                              +

                              Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                              +

                              Promtail Related files

                              +

                              Promtail has a configuration file. You need to copy and modify the configuration.

                              +
                              mkdir -p /etc/promtail/
                              +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                              +
                              +
                              +

                              Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                              +
                              +
                              +

                              Install Prometheus

                              +

                              Tested with Prometheus version 2.27.1

                              +
                              +

                              Note

                              +

                              If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                              +
                              +
                                +
                              1. Install Prometheus

                              2. +
                              +
                              wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                              +tar -xvf prometheus-*.linux-amd64.tar.gz
                              +
                              +
                              +

                              2. Create Data and Config directories +.. code-block:: shell

                              +
                              +

                              mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                              +
                              +
                                +
                              1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                              2. +
                              +

                              Copy prometheus/prometheus.yml.template to prometheus.yml

                              +

                              For example:

                              +
                              cp scylla-monitoring-scylla-monitoring-4.5.1/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                              +cp scylla-monitoring-scylla-monitoring-4.5.1/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                              +
                              +
                              +
                                +
                              1. Edit the prometheus.yml file to point to the correct static data sources.

                              2. +
                              +
                              +

                              Note

                              +

                              Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                              +
                              +
                              vi /etc/prometheus/prometheus.yml
                              +
                              +
                              +

                              Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                              +

                              For example if the alertmanager will run on the same host:

                              +
                              alerting:
                              +   alertmanagers:
                              +   - static_configs:
                              +       - targets:
                              +           - 127.0.0.1:9093
                              +
                              +
                              +

                              Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                              +

                              For example the scrape config for Scylla:

                              +
                              global:
                              +  scrape_interval: 5s # By default, scrape targets every 5 second.
                              +  scrape_timeout: 4s # Timeout before trying to scape a target again
                              +
                              +  # Attach these labels to any time series or alerts when communicating with
                              +  # external systems (federation, remote storage, Alertmanager).
                              +  external_labels:
                              +    monitor: 'scylla-monitor'
                              +
                              +scrape_configs:
                              +- job_name: scylla
                              +  honor_labels: false
                              +  file_sd_configs:
                              +    - files:
                              +      - /etc/scylla.d/prometheus/scylla_servers.yml
                              +  relabel_configs:
                              +    - source_labels: [__address__]
                              +      regex:  '([^:]+)'
                              +      target_label: __address__
                              +      replacement: '${1}:9180'
                              +
                              +    - source_labels: [__address__]
                              +      regex:  '(.*):.+'
                              +      target_label: instance
                              +      replacement: '${1}'
                              +
                              +
                              +
                                +
                              1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                              2. +
                              +
                              +

                              Note

                              +

                              There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                              +
                              +

                              An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                              +
                              +

                              Note

                              +

                              You must have both files even if you are not using Scylla Manager

                              +
                              +

                              Add the labels for the cluster and data-center

                              +

                              scylla_servers.yml:

                              +

                              For example:

                              +
                              cat scylla_servers.yml
                              +# List Scylla end points
                              +
                              +- targets:
                              +  - 192.168.66.6
                              +  - 192.168.66.244
                              +  labels:
                              +    cluster: cluster1
                              +    dc: dc1
                              +- targets:
                              +    - 172.17.0.3
                              +  labels:
                              +    cluster: cluster1
                              +    dc: dc2
                              +
                              +
                              +
                              +

                              Note

                              +

                              See the previous note about deprecating the node_exporter_servers.yml file.

                              +
                              +

                              scylla_manager_server.yml

                              +

                              For example:

                              +
                              - targets:
                              +  - 127.0.0.1:5090
                              +
                              +
                              +
                                +
                              1. Start Prometheus server:

                              2. +
                              +

                              For example:

                              +
                              cd scylla-monitoring-scylla-monitoring-4.5.1/
                              +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                              +
                              +
                              +

                              Data should start accumulate on: /prometheus/data

                              +
                                +
                              1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                              2. +
                              +

                              For example:

                              +
                              http://192.168.135.166:9090/
                              +
                              +
                              +../_images/1.png +

                              Prometheus console should be visible

                              +
                                +
                              1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                              2. +
                              +

                              For example:

                              +

                              node_memory_MemFree

                              +../_images/2.png +

                              And

                              +

                              scylla_reactor_utilization

                              +../_images/3.png +

                              At this point Scylla is emitting the metrics and Prometheus is able to store them.

                              +
                              +
                              +

                              Install Grafana

                              +

                              Tested with Grafna 7.5.7

                              +
                                +
                              1. Install Grafana based on the instructions here

                              2. +
                              +

                              Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                              +
                                +
                              1. Access Scylla-Grafana-monitoring directory

                              2. +
                              +
                              cd scylla-monitoring-scylla-monitoring-4.5.1/
                              +
                              +
                              +
                                +
                              1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                              2. +
                              +
                              sudo cp -r grafana/plugins /var/lib/grafana/
                              +
                              +
                              +

                              If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                              +

                              For example:

                              +
                              cp -r grafana/plugins ../grafana-7.5.7/public/app
                              +
                              +
                              +
                                +
                              1. Provision the Dashboards

                              2. +
                              +

                              For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                              +

                              For Grafana installed with yum install

                              +
                              sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                              +sudo mkdir -p /var/lib/grafana/dashboards
                              +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                              +
                              +
                              +

                              For Grafana installed from packages

                              +
                              cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                              +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                              +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                              +
                              +
                              +

                              Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                              +
                              +

                              Note

                              +

                              A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                              +
                              +
                                +
                              1. Set the data source by copy datasource.yml and edit it

                              2. +
                              +
                              sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                              +
                              +
                              +
                              +

                              Note

                              +

                              Scylla uses a plugin to read from some system tables see the section below about using it.

                              +
                              +

                              For Grafana installed from packages

                              +
                              cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                              +
                              +
                              +

                              You should set the Prometheus and the alertmanager IP and port.

                              +

                              For example

                              +
                              sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                              +apiVersion: 1
                              +datasources:
                              + - name: prometheus
                              +   type: prometheus
                              +   url: http://192.168.135.167:9090
                              +   access: proxy
                              +   basicAuth: false
                              +
                              + - name: alertmanager
                              +   type: camptocamp-prometheus-alertmanager-datasource
                              +   orgId: 1
                              +   typeLogoUrl: public/img/icn-datasource.svg
                              +   access: proxy
                              +   url: http://192.168.135.166:9093
                              +   password:
                              +   user:
                              +   database:
                              +   basicAuth:
                              +   isDefault:
                              +   jsonData:
                              +     severity_critical: '4'
                              +     severity_high: '3'
                              +     severity_warning: '2'
                              +     severity_info: '1'
                              +
                              +
                              +
                                +
                              1. Start the Grafana service

                              2. +
                              +

                              For Grafana installed with yum install

                              +

                              sudo service grafana-server start

                              +

                              For Grafana installed from packages:

                              +

                              cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                              +

                              Edit scylla.ini to reflect the right paths in the paths section of the file.

                              +
                              plugins = /home/centos/grafana-7.5.7/data/plugins
                              +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                              +
                              +
                              +

                              Start the server:

                              +
                              cd /home/centos/grafana-7.5.7/
                              +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                              +
                              +
                              +
                                +
                              1. Make sure Grafana is running

                              2. +
                              +

                              Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                              +../_images/grafana.png +
                              +
                              +

                              Using Scylla Plugin with Grafana

                              +

                              Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                              +

                              Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                              +
                              +

                              Setting a monitoring user

                              +

                              This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                              +
                                +
                              • If you have not done so, enable authorization first.

                              • +
                              • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                              • +
                              • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                              • +
                              +
                              +
                              +

                              Installing the Plugin

                              +

                              Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                              +
                              +
                              +

                              Configure the Plugin

                              +

                              Add an entry to the datasource.yml file

                              +
                              - name: scylla-datasource
                              +  type: scylladb-scylla-datasource
                              +  orgId: 1
                              +  isDefault:
                              +  jsonData:
                              +  host: ''
                              +#  secureJsonData:
                              +#    user: 'scylla_monitoring'
                              +#    password: 'scylla_monitoring'
                              +
                              +
                              +

                              As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                              +
                              +
                              +

                              Enable the Plugin

                              +

                              Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                              +

                              See more about it the Grafana configurtion.

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/monitoring-stack.html b/branch-4.5/install/monitoring-stack.html new file mode 100644 index 000000000..9cbbca1e1 --- /dev/null +++ b/branch-4.5/install/monitoring-stack.html @@ -0,0 +1,1099 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Install Scylla Monitoring Stack

                              +

                              This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                              +

                              The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                              +

                              For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                              +
                              +

                              Minimal Production System Recommendations

                              +
                                +
                              • CPU - at least 2 physical cores/ 4vCPUs

                              • +
                              • Memory - 15GB+ DRAM and proportional to the number of cores.

                              • +
                              • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                              • +
                              • Network - 1GbE/10GbE preferred

                              • +
                              +
                              +

                              Calculating Prometheus Minimal Disk Space requirement

                              +

                              Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                              +

                              Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                              +

                              For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                              +
                              6 * 16 * 15 * 12MB ~ 16GB
                              +
                              +
                              +

                              To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                              +
                              +
                              +

                              Calculating Prometheus Minimal Memory Space requirement

                              +

                              Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                              +

                              For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                              + +
                              + +++++++ + + + +
                              # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                              00
                              + +
                              +
                              +
                              +
                              +

                              Prerequisites

                              +
                                +
                              • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                              • +
                              • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                              • +
                              + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              Scylla Monitoring Stack Compatibility Matrix

                              Scylla Monitoring Stack Version

                              Prometheus Version

                              Grafana Version

                              4.5

                              2.47.1

                              10.1.5

                              4.4

                              2.44.0

                              9.5.2

                              4.3

                              2.42.0

                              9.3.8

                              4.2

                              2.41.0

                              9.3.4

                              4.1

                              2.38.0

                              9.1.0

                              4.0

                              2.34.0

                              8.5.2

                              3.11

                              2.32.0

                              8.3.4

                              3.10

                              2.32.0

                              8.3.3

                              3.9.2

                              2.29.1

                              8.2.7

                              3.9

                              2.29.1

                              8.1.1

                              3.8

                              2.27.1

                              7.5.7

                              3.7

                              2.25.2

                              7.4.0

                              3.6

                              2.18.1

                              7.3.5

                              3.5

                              2.18.1

                              7.1.5

                              3.4

                              2.18.1

                              6.7.3

                              +
                              +
                              +

                              Docker Post Installation

                              +

                              Docker post installation guide can be found here

                              +
                              +

                              Note

                              +

                              Avoid running the container as root.

                              +
                              +

                              To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                              +
                                +
                              1. Create the Docker group.

                              2. +
                              +
                              sudo groupadd docker
                              +
                              +
                              +
                                +
                              1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                              2. +
                              +
                              sudo usermod -aG docker $USER
                              +
                              +
                              +
                                +
                              1. Start Docker by calling:

                              2. +
                              +
                              sudo systemctl enable docker
                              +
                              +
                              +
                              +
                              +

                              Install Scylla Monitoring Stack

                              +

                              Procedure

                              +
                                +
                              1. Download and extract the latest Scylla Monitoring Stack binary;.

                              2. +
                              +
                              wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.5.1.tar.gz
                              +tar -xvf scylla-monitoring-4.5.1.tar.gz
                              +cd scylla-monitoring-scylla-monitoring-4.5.1
                              +
                              +
                              +

                              As an alternative, you can clone and use the Git repository directly.

                              +
                              git clone https://github.com/scylladb/scylla-monitoring.git
                              +cd scylla-monitoring
                              +git checkout branch-4.5
                              +
                              +
                              +
                                +
                              1. Start Docker service if needed

                              2. +
                              +
                              sudo systemctl restart docker
                              +
                              +
                              +
                              +
                              +

                              Configure Scylla Monitoring Stack

                              +

                              To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                              +

                              This configuration can be done from files, or using the Consul api.

                              +

                              Scylla Manager 2.0 and higher supports the Consul API.

                              +
                              +

                              Configure Scylla nodes from files

                              +
                                +
                              1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                              2. +
                              +
                              +

                              Note

                              +

                              It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                              +
                              +

                              For example:

                              +
                              - targets:
                              +      - 172.17.0.2
                              +      - 172.17.0.3
                              +  labels:
                              +      cluster: cluster1
                              +      dc: dc1
                              +
                              +
                              +
                              +

                              Note

                              +

                              If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                              +
                              +

                              Using IPV6

                              +

                              To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets and the port numbers.

                              +

                              For example:

                              +
                              - targets:
                              +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]:9180"
                              +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]:9180"
                              +  labels:
                              +      cluster: cluster1
                              +      dc: dc1
                              +
                              +
                              +
                              +

                              Note

                              +

                              For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                              +
                              +

                              For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                              +
                              +

                              Note

                              +

                              By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                              +
                              +

                              If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                              +

                              For example:

                              +
                              ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                              +
                              +
                              +

                              Mark the different Data Centers with Labels.

                              +

                              As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                              +

                              You can use the genconfig.py script to generate the server file. For example:

                              +
                              ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                              +
                              +
                              +

                              This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                              +

                              OR

                              +

                              The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                              +
                              nodetool status | ./genconfig.py -NS
                              +
                              +
                              +

                              2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                              +

                              You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                              +

                              For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                              +
                              # List Scylla Manager end points
                              +
                              +- targets:
                              +  - 172.17.0.7:5090
                              +
                              +
                              +

                              Note that you do not need to add labels to the Scylla Manager targets.

                              +
                              +
                              +

                              Configure Scylla nodes using Scylla-Manager Consul API

                              +

                              Scylla Manager 2.0 has a Consul like API.

                              +

                              When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                              +

                              For example:

                              +
                              ./start-all.sh -L 10.10.0.1
                              +
                              +
                              +
                              +

                              Note

                              +

                              If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                              +
                              +
                              +
                              +

                              Connecting Scylla-Monitoring to ScyllaDB

                              +

                              Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                              +

                              You can limit the user to read only, currently it only read table from the system keyspace.

                              +

                              You can set a user and password from a file or environment variables.

                              +

                              If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                              +

                              To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                              +
                              +

                              Note

                              +

                              It is best to use a dedicated user and password with limited privileges.

                              +
                              +
                              +
                              +

                              Use an external directory for the Prometheus data directory

                              +

                              The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                              +
                              +

                              Note

                              +

                              Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                              +
                              +

                              If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                              +

                              In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                              +
                              +
                              +

                              Add Additional Prometheus Targets

                              +

                              There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                              +

                              The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                              +

                              You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                              +
                              - job_name: 'myservice'
                              +  # Override the global default and scrape targets from this job every 5 seconds.
                              +  scrape_interval: 5s
                              +  static_configs:
                              +    - targets:
                              +      - 17.0.0.1:7000
                              +
                              +
                              +
                              +
                              +
                              +

                              Start and Stop Scylla Monitoring Stack

                              +
                              +

                              Start

                              +
                              ./start-all.sh -d prometheus_data
                              +
                              +
                              +
                              +
                              +

                              Stop

                              +
                              ./kill-all.sh
                              +
                              +
                              +
                              +
                              +

                              Start a Specific Scylla Monitoring Stack Version

                              +

                              By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                              +

                              You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                              +

                              Multiple versions are supported. For example:

                              +
                              ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                              +
                              +
                              +

                              will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                              +
                              +
                              +

                              Accessing the localhost

                              +

                              The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                              +
                              ./start-all.sh -l -d prometheus-data
                              +
                              +
                              +
                              +
                              +

                              Configure rsyslog on each Scylla node

                              +

                              generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                              +

                              Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                              +

                              Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                              +

                              If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                              +
                              if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                              +
                              +
                              +

                              Restart rsyslog for the configuration to take effect.

                              +
                              systemctl restart rsyslog
                              +
                              +
                              +
                              +
                              +
                              +

                              View Grafana Dashboards

                              +

                              Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/start-all.html b/branch-4.5/install/start-all.html new file mode 100644 index 000000000..942d22f36 --- /dev/null +++ b/branch-4.5/install/start-all.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              The start-all.sh Command

                              +

                              Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                              +

                              The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                              +
                              +

                              General Options

                              +

                              -h Help, Print the help, and exit.

                              +

                              –version print the current Scylla-Monitoring stack version, and exit.

                              +

                              -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                              +

                              -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                              +

                              -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                              +

                              –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                              +
                              + + +
                              +

                              Alert Manager

                              +

                              The Alertmanager handles the alerts and takes the following parameters:

                              +

                              -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                              +

                              -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                              +

                              -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/install/thanos.html b/branch-4.5/install/thanos.html new file mode 100644 index 000000000..11bc51d99 --- /dev/null +++ b/branch-4.5/install/thanos.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Using Thanos as Data Source With Scylla Monitoring Stack

                              +

                              Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                              +
                                +
                              • High-availability.

                              • +
                              • Horizontal scaling.

                              • +
                              • Backup.

                              • +
                              +

                              The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                              +

                              The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                              +
                              +

                              Using Thanos As a Prometheus Aggregator

                              +

                              There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                              +
                              +

                              Prometheus Configuration

                              +

                              We will assume you have two Prometheus servers running.

                              +
                                +
                              1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                              2. +
                              3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                              4. +
                              +
                              +
                              +

                              Thanos sidecar

                              +

                              The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                              +
                              docker run -d \
                              + -v /path/to/prom/dir:/data/prom:z \
                              + -i --name sidecar thanosio/thanos \
                              + sidecar \
                              + --grpc-address=0.0.0.0:10911 \
                              + --grpc-grace-period=1s \
                              + --http-address=0.0.0.0:10912 \
                              + --http-grace-period=1s \
                              + --prometheus.url=http://prometheus-ip:9090 \
                              + --tsdb.path=/data/prom \
                              + -p 10912:10912 \
                              + -p 10911:10911
                              +
                              +
                              +

                              After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                              +
                              +
                              +

                              Thanos query

                              +

                              Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                              +
                              docker run -d \
                              + --name thanos -- thanosio/thanos \
                              +   query \
                              +   --debug.name=query0 \
                              +   --log.level=debug \
                              +   --grpc-address=0.0.0.0:10903 \
                              +   --grpc-grace-period=1s \
                              +   --http-address=0.0.0.0:10904 \
                              +   --http-grace-period=1s \
                              +   --query.replica-label=prometheus \
                              +   --store={ip1}:10911 --store={ip2}:10911
                              +
                              +
                              +

                              After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                              +
                              +
                              +

                              Update Scylla Data source

                              +

                              The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                              +

                              The file you edit is a template file that replaces the file Grafana uses, next time you start.

                              +

                              Restart the Scylla Monitoring Stack it should now use Thanos.

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/intro.html b/branch-4.5/intro.html new file mode 100644 index 000000000..53f31afa2 --- /dev/null +++ b/branch-4.5/intro.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              ScyllaDB Monitoring Stack

                              +

                              ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                              +_images/monitor.png +

                              The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                              +
                                +
                              • prometheus - Collects and stores metrics

                              • +
                              • grafan-loki - Parses logs and generates metrics and alerts

                              • +
                              • alertmanager - Handles alerts

                              • +
                              • grafana - Dashboards server

                              • +
                              +

                              A few optional components are used for additional services

                              +
                                +
                              • grafana-image-renderer - Allows you to download a dashboard as an image.

                              • +
                              • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                              • +
                              +
                              +

                              High Level Architecture

                              +_images/monitoring_stack1.png +

                              We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                              +

                              We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                              +

                              The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                              +

                              We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                              +

                              Choose a topic to get started:

                              + +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/objects.inv b/branch-4.5/objects.inv new file mode 100644 index 000000000..9485eb596 Binary files /dev/null and b/branch-4.5/objects.inv differ diff --git a/branch-4.5/procedures/alerts/alerting.html b/branch-4.5/procedures/alerts/alerting.html new file mode 100644 index 000000000..f60c995a7 --- /dev/null +++ b/branch-4.5/procedures/alerts/alerting.html @@ -0,0 +1,750 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Alerting

                              +

                              Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                              +

                              You can read more about Prometheus alerting here

                              +

                              By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                              +

                              In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                              +

                              The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                              +../../_images/monitoring_stack.png +
                              +

                              Prometheus Alerts

                              +

                              The Prometheus alerts are defined in the prometheus.rules.yml file that is located in the prometheus directory.

                              +

                              Each alert consists of:

                              +
                                +
                              • Name

                              • +
                              • What happened

                              • +
                              • For how long

                              • +
                              • What to report

                              • +
                              +

                              For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                              +
                              - alert: InstanceDown
                              +  expr: up == 0
                              +  for: 60s
                              +  labels:
                              +    severity: "2"
                              +  annotations:
                              +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                              +    summary: Instance {{ $labels.instance }} down
                              +
                              +
                              +

                              The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                              +

                              The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                              +

                              The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to 2.

                              +

                              annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                              +
                              +
                              +

                              Alertmanager

                              +

                              The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                              +

                              The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                              +
                                +
                              • Routes: Represent a routing tree, the most specific rule, wins

                              • +
                              • Inhibition: Mute an alert, based on another alert

                              • +
                              • Receiver: Send a notification via email, sluck, etc’

                              • +
                              +

                              Check the Alertmanager documentation for details on how to specify a specific receiver.

                              +

                              In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                              +
                              +
                              +

                              Tips When Adding an Alert

                              +

                              It’s worse having an alert that does not work, than not having an alert at all

                              +

                              There are multiple ways you can use to make sure your alert is set correctly:

                              +
                                +
                              • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                              • +
                              • Force the alert to be active by reducing the limits or the duration.

                              • +
                              • When possible simulate the actual scenario and see that the alert works as expected.

                              • +
                              +

                              For example, low available disk space.

                              +

                              Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                              +

                              Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                              +

                              Starting with a simple working expression helps you bisect problems.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/procedures/alerts/index.html b/branch-4.5/procedures/alerts/index.html new file mode 100644 index 000000000..e61daaa8b --- /dev/null +++ b/branch-4.5/procedures/alerts/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Alert Manager

                              +
                              +
                              +

                              Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/procedures/datadog/index.html b/branch-4.5/procedures/datadog/index.html new file mode 100644 index 000000000..1d64ad831 --- /dev/null +++ b/branch-4.5/procedures/datadog/index.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Datadog Integration

                              +

                              The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                              +
                                +
                              1. Installing and configuring the Datadog Agent.

                              2. +
                              3. Add Datadog recording rules.

                              4. +
                              5. Loading Scylla dashboard to Datadog.

                              6. +
                              7. Optionally load Monitor (Alerts).

                              8. +
                              +
                              +

                              Note

                              +

                              Scylla Cloud users, use and update the proper configuration file.

                              +
                              +
                              +

                              Install And configure the Datadog Agent

                              +

                              Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                              +

                              Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                              +
                              +

                              Scylla Cloud Users

                              +

                              Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                              +

                              Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                              +
                              +
                              +

                              Other Scylla Users

                              +

                              Other Scylla users, download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                              +
                              +
                              +

                              Post configuration

                              +

                              Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                              +
                              +

                              Note

                              +

                              By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                              +
                              +
                              +
                              +
                              +

                              Add datadog recording rules

                              +

                              Non Scylla Cloud users, download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                              +

                              Cloud users, skip this step, it’s been take care for by the cloud.

                              +
                              +
                              +

                              Upload the Dashboard

                              +

                              Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                              +
                              +
                              +

                              Using the Dashboard

                              +

                              We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                              +../../_images/datadog.png +

                              The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                              +
                              +

                              Note

                              +

                              Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                              +
                              +
                              +
                              +

                              Adding Monitor

                              +

                              Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/procedures/index.html b/branch-4.5/procedures/index.html new file mode 100644 index 000000000..2febde13a --- /dev/null +++ b/branch-4.5/procedures/index.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              ScyllaDB Monitoring Stack Procedures

                              +
                              +
                              +

                              There are several reference guides available which give additional information. Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/procedures/updating-dashboard.html b/branch-4.5/procedures/updating-dashboard.html new file mode 100644 index 000000000..3ce6dfe34 --- /dev/null +++ b/branch-4.5/procedures/updating-dashboard.html @@ -0,0 +1,959 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Adding and Modifying Dashboards

                              +

                              This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                              +

                              It covers dashboard templates and how to modify them.

                              + +
                              +

                              General Limitations

                              +

                              Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                              +
                              +

                              Consistency Between Restarts

                              +

                              By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                              +
                              +
                              +

                              Consistency Between Upgrades

                              +

                              As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                              +
                              +

                              Note

                              +

                               You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                              +
                              +

                              At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                              +
                              +
                              +
                              +

                              Using Templated Dashboards

                              +

                              Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                              +

                              Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                              +

                              For example a typical graph panel would look like this:

                              +
                              {
                              +    "aliasColors": {},
                              +    "bars": false,
                              +    "datasource": "prometheus",
                              +    "editable": true,
                              +    "error": false,
                              +    "fill": 0,
                              +    "grid": {
                              +        "threshold1": null,
                              +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                              +        "threshold2": null,
                              +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                              +    },
                              +    "gridPos": {
                              +        "h": 6,
                              +        "w": 10,
                              +        "x": 0,
                              +        "y": 4
                              +    },
                              +    "id": 2,
                              +    "isNew": true,
                              +    "legend": {
                              +        "avg": false,
                              +        "current": false,
                              +        "max": false,
                              +        "min": false,
                              +        "show": false,
                              +        "total": false,
                              +        "values": false
                              +    },
                              +    "lines": true,
                              +    "linewidth": 2,
                              +    "links": [],
                              +    "nullPointMode": "connected",
                              +    "percentage": false,
                              +    "pointradius": 5,
                              +    "points": false,
                              +    "renderer": "flot",
                              +    "seriesOverrides": [
                              +        {}
                              +    ],
                              +    "span": 5,
                              +    "stack": false,
                              +    "steppedLine": false,
                              +    "targets": [
                              +        {
                              +            "expr": "sum(node_filesystem_avail) by (instance)",
                              +            "intervalFactor": 1,
                              +            "legendFormat": "",
                              +            "refId": "A",
                              +            "step": 1
                              +        }
                              +    ],
                              +    "timeFrom": null,
                              +    "timeShift": null,
                              +    "title": "Available Disk Size",
                              +    "tooltip": {
                              +        "msResolution": false,
                              +        "shared": true,
                              +        "sort": 0,
                              +        "value_type": "cumulative"
                              +    },
                              +    "transparent": false,
                              +    "type": "graph",
                              +    "xaxis": {
                              +        "show": true
                              +    },
                              +    "yaxes": [
                              +        {
                              +            "format": "percent",
                              +            "logBase": 1,
                              +            "max": 101,
                              +            "min": 0,
                              +            "show": true
                              +        },
                              +        {
                              +            "format": "short",
                              +            "logBase": 1,
                              +            "max": null,
                              +            "min": null,
                              +            "show": true
                              +        }
                              +    ]
                              +}
                              +
                              +
                              +

                              As you can imagine, most panels would have similar values.

                              +

                              To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                              +
                              +

                              The Template Class System

                              +

                              The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                              +

                              The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                              +

                              In the template file, you can also add or override attributes.

                              +

                              The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                              +

                              When generating dashboards, each class will be replaced by its definition.

                              +

                              For example, a row in the type.json is defined as:

                              +
                              {
                              + "base_row": {
                              +     "collapse": false,
                              +     "editable": true
                              + },
                              + "row": {
                              +     "class": "base_row",
                              +     "height": "250px"
                              + }
                              + }
                              +
                              +
                              +

                              Will be used like in a template:

                              +
                              {
                              +     "class": "row",
                              +     "height": "150px",
                              +     "panels": [
                              +     ]
                              +}
                              +
                              +
                              +

                              And the output will be:

                              +
                              {
                              +     "class": "row",
                              +     "collapse": false,
                              +     "editable": true,
                              +     "height": "150px",
                              +     "panels": [
                              +
                              +     ]
                              +}
                              +
                              +
                              +

                              We can see that the template added the panels attribute and that it overrides the height attribute.

                              +
                              +
                              +

                              Panel Example

                              +

                              Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                              +
                              {
                              +     "class": "row",
                              +     "panels": [
                              +         {
                              +             "class": "bytes_panel",
                              +             "span": 3,
                              +             "targets": [
                              +                 {
                              +                     "expr": "sum(node_filesystem_avail) by (instance)",
                              +                     "intervalFactor": 1,
                              +                     "legendFormat": "",
                              +                     "metric": "",
                              +                     "refId": "A",
                              +                     "step": 1
                              +                 }
                              +             ],
                              +             "title": "Available Disk Size"
                              +         }
                              +     ]
                              +}
                              +
                              +
                              +

                              In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                              +

                              You can also see that the span attribute is overridden to set the panel size.

                              +

                              To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                              +
                              +
                              +

                              Grafana Formats and Layouts

                              +

                              The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                              +

                              Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                              +

                              The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                              +

                              To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                              +

                              The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                              +

                              You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                              +

                              gridPos has the following attributes:

                              +
                              {
                              +   "x": 0,
                              +   "y": 0,
                              +   "w": 24,
                              +   "h": 4
                              + }
                              +
                              +
                              +

                              When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                              +
                              {
                              +   "gridPos": {
                              +      "h": 2
                              +    }
                              +}
                              +
                              +
                              +
                              +
                              +

                              Generating the dashboards from templates (generate-dashboards.sh)

                              +
                              +

                              Prerequisite

                              +

                              Python 2.7

                              +

                              make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                              +

                              Use the -h flag to get help information.

                              +

                              You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                              +

                              When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                              +

                              For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                              +

                              .\generate-dashboards.sh -v 2020.1

                              +
                              +

                              Note

                              +

                              generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                              +
                              +
                              +
                              +
                              +

                              Validation

                              +

                              After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                              +

                              Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/reference/index.html b/branch-4.5/reference/index.html new file mode 100644 index 000000000..2c29d4d2f --- /dev/null +++ b/branch-4.5/reference/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Reference Guide

                              +
                              +
                              +

                              There are several reference guides available which give additional information. Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/reference/matrix.html b/branch-4.5/reference/matrix.html new file mode 100644 index 000000000..280caa7e0 --- /dev/null +++ b/branch-4.5/reference/matrix.html @@ -0,0 +1,849 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Support Matrix

                              +

                              The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                              + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                              Scylla Monitoring Stack Version

                              Scylla Open Source Version

                              Scylla Enterprise Version

                              Node_exporter[1] Version

                              Scylla Manager Version

                              4.5

                              5.0,5.1,5.2,5.4

                              2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                              1.4.1

                              3.0, 3.1, 3.2

                              4.4.5

                              5.0,5.1,5.2,5.4

                              2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                              1.4.1

                              3.0, 3.1, 3.2

                              4.4

                              5.0,5.1,5.2

                              2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                              1.4.1

                              3.0, 3.1

                              4.3

                              5.0,5.1,5.2

                              2020.1, 2021.1, 2022.1, 2022.2

                              1.4.1

                              2.5, 2.6, 3.0

                              4.2

                              4.5,4.6,5.0,5.1

                              2020.1, 2021.1, 2022.1, 2022.2

                              1.4.1

                              2.5, 2.6, 3.0

                              4.1

                              4.5,4.6,5.0,5.1

                              2020.1, 2021.1, 2022.1, 2022.2

                              0.17

                              2.5, 2.6, 3.0

                              4.0

                              4.3, 4.4, 4.5, 4.6, 5.0

                              2020.1, 2021.1, 2022.1

                              0.17

                              2.3, 2.4, 2.5, 2.6, 3.0

                              3.11

                              4.3, 4.4, 4.5, 4.6, 5.0

                              2020.1, 2021.1, 2022.2

                              0.17

                              2.3, 2.4, 2.5, 2.6

                              3.10

                              4.3, 4.4, 4.5, 4.6

                              2020.1, 2021.1

                              0.17

                              2.3, 2.4, 2.5, 2.6

                              3.9

                              4.3, 4.4, 4.5, 4.6

                              2020.1, 2021.1

                              0.17

                              2.3, 2.4, 2.5

                              3.8

                              4.3, 4.4, 4.5

                              2020.1, 2021.1

                              0.17

                              2.3, 2.4, 2.5

                              3.7

                              4.2, 4.3, 4.4

                              2019.1, 2020.1, 2021.1

                              0.17

                              2.2, 2.3

                              3.6.3

                              4.2, 4.3, 4.4

                              2019.1, 2020.1, 2021.1

                              0.17

                              2.2, 2.3, 2.1

                              3.6

                              4.1, 4.2, 4.3

                              2019.1, 2020.1

                              0.17

                              2.1, 2.2, 2.3

                              3.6.1

                              4.1, 4.2, 4.3

                              2019.1, 2020.1

                              0.17

                              2.1, 2.2

                              3.6.1

                              4.1, 4.2, 4.3, 4.4

                              2019.1, 2020.1

                              0.17

                              2.1, 2.2

                              3.5

                              3.3, 4.0, 4.1, 4.2

                              2019.1, 2020.1

                              0.17

                              2.0, 2.1, 2.2

                              3.4.3

                              3.3, 4.0, 4.1, 4.2

                              2019.1, 2020.1

                              0.17

                              2.0, 2.1

                              3.4

                              3.3, 4.0, 4.1

                              2018.1, 2019.1

                              0.17

                              2.0, 2.1

                              3.3

                              3.1, 3.2, 3.3, 4.0

                              2018.1, 2019.1

                              0.17

                              1.4, 2.0, 2.1

                              3.2

                              3.1, 3.2, 3.3

                              2018.1, 2019.1

                              0.17

                              1.4, 2.0

                              3.1

                              2.3, 3.0, 3.1, 3.2

                              2018.1, 2019.1

                              0.17

                              1.3, 1.4, 2.0

                              3.0

                              2.3, 3.0, 3.1, 3.2

                              2018.1, 2019.1

                              0.17

                              1.3, 1.4

                              2.4

                              2.3, 3.0, 3.1

                              2018.1, 2019.1

                              0.14, 0.17

                              1.3, 1.4

                              2.3

                              2.3, 3.0

                              2018.1, 2019.1

                              0.14, 0.17

                              1.3

                              2.2

                              2.3, 3.0

                              2018.1, 2019.1

                              0.14, 0.17

                              1.3

                              2.1

                              2.3, 3.0

                              2018.1

                              0.14, 0.17

                              1.3

                              +

                              [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/reference/monitoring-apis.html b/branch-4.5/reference/monitoring-apis.html new file mode 100644 index 000000000..adc961c9f --- /dev/null +++ b/branch-4.5/reference/monitoring-apis.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Interfaces

                              +

                              Scylla exposes two interfaces for online monitoring, as described below

                              +
                              +

                              Prometheus API

                              +

                              By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                              +

                              For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                              +

                              You can change the Prometheus listening address and port in scylla.yaml file

                              +
                              # prometheus port
                              +# By default, Scylla opens prometheus API port on port 9180
                              +# setting the port to 0 will disable the prometheus API.
                              +prometheus_port: 9180
                              +#
                              +# prometheus address
                              +# By default, Scylla binds all interfaces to the prometheus API
                              +# It is possible to restrict the listening address to a specific one
                              +prometheus_address: 0.0.0.0
                              +
                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/robots.txt b/branch-4.5/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.5/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.5/search.html b/branch-4.5/search.html new file mode 100644 index 000000000..6c45bb8f2 --- /dev/null +++ b/branch-4.5/search.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + + + +
                              + + + + + +
                              + + +
                              + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/searchindex.js b/branch-4.5/searchindex.js new file mode 100644 index 000000000..bd16d2dc7 --- /dev/null +++ b/branch-4.5/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "5": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "1": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 18, 19, 21, 22, 23, 24, 25, 30, 31, 33, 35, 37, 38, 41], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 27, 28, 29, 30, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 27], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 30, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 26, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25, 26], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 26, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 26, 28, 29, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 26, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25, 26], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 27, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 28, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 26, 33], "user": [1, 2, 6, 7, 9, 27, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25, 26], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9], "refer": [1, 6, 9, 13], "upgrad": [1, 13], "lesson": [1, 9, 28, 29, 30], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25, 26], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 27, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 30, 32, 33, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 27, 31, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25, 26], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 28, 31, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 27, 30, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 12, 14, 19, 21, 22, 23, 24, 25, 26], "onc": [2, 12, 21, 25, 32, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 26, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 26, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 28, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 26, 28, 30, 31, 33, 35, 41], "both": [2, 5, 6, 12, 19, 22, 24, 25, 26, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 27, 39, 41], "updat": [2, 5, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 26, 29, 33, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25, 26], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25, 26], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 26, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 26, 28, 33, 34, 41], "advis": [2, 34, 41], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 26, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26], "databas": [2, 5, 7, 21, 30, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 27, 31, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 27, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25, 26], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 14, 21, 22, 23, 24, 25, 26, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 12, 14, 16, 19, 21, 22, 24, 25, 26, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 26, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 12, 25], "yaml": [2, 5, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25, 26], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25, 26], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 28, 31, 33, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 26, 28, 29, 30, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "24": [2, 14, 25], "0": [2, 5, 6, 7, 8, 10, 14, 16, 17, 21, 22, 23, 24, 25, 26], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25, 26], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25, 26], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 14, 19, 22, 24, 25, 26], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 25, 34], "json": [2, 12, 14], "9": [2, 6, 16, 25], "3": [2, 4, 5, 6, 14, 16, 20, 35], "11": [2, 6, 16], "3000": [2, 5, 6, 22, 24, 25, 26], "1000": [2, 33], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 14, 29, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25, 26], "dir": [2, 7, 8, 22, 24, 25, 26], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 10, 12, 14, 16, 20, 24, 35], "7": [2, 5, 6, 14, 16], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 32, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "42": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25, 26], "prom_rul": [2, 5, 12, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25, 26], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 26, 28, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 26, 30, 34, 35, 37, 39, 41], "compos": 3, "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 26, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 33, 39], "section": [4, 5, 6, 12, 19, 21, 24, 25, 26, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 30, 34, 35, 37, 41], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 31, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25, 26], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 38], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 28, 29, 30, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 28, 30, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 25, 30, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 32, 39, 41], "need": [4, 5, 6, 7, 8, 12, 14, 19, 25, 28, 29, 30, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25, 26], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 26, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 28, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 28, 34, 41], "out": [4, 5, 6, 8, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25, 26], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 27, 30, 41], "take": [4, 5, 6, 7, 12, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25, 26], "help": [5, 7, 10, 14, 41], "pleas": [5, 19], "most": [5, 10, 14, 25, 36, 41], "common": [5, 7, 41], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25, 26], "consolid": 5, "componen": 5, "suggest": [5, 14, 25], "those": [5, 25], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 28, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 30, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 26, 28, 29, 35, 41], "support": [5, 6, 14, 15, 27, 41], "want": [5, 6, 10, 22, 24, 25, 26], "latest": [5, 6, 7, 22, 24, 25, 26], "releas": [5, 21, 22, 23, 24, 25, 26], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25, 26], "http": [5, 6, 8, 19, 21, 22, 24, 25, 26, 30, 31, 38], "com": [5, 6, 22, 24, 25, 26, 30, 31, 38], "archiv": [5, 6, 22, 24, 25, 26], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25, 26], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24, 26], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25, 26], "p": [5, 7, 8, 19, 21, 22, 24, 25, 26], "cd": [5, 6, 22, 24, 25, 26], "verifi": [5, 23], "point": [5, 6, 14, 22, 24, 25, 26], "browser": [5, 6, 8, 14, 19, 22, 24, 25, 26], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 26, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 26, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 32, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 12, 19, 25, 27, 30, 31, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 28, 31, 32, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 26, 30, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24, 26], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 12, 14, 27, 28, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25, 26], "scrap": [5, 7, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 12, 19, 21, 23, 25, 30, 32, 33, 39, 41], "import": [5, 6, 7, 12, 21, 22, 24, 25, 26, 33], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25, 26], "code": [5, 34], "shell": 5, "correct": [5, 23, 41], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21], "host": [5, 6, 7, 9, 19], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23], "127": [5, 7, 19], "right": [5, 6, 14, 41], "typic": [5, 14, 25, 28, 30, 39, 41], "node_export": [5, 6, 7, 9, 16], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 31, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": [5, 18], "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 6, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 19, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7, 19], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25, 26], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 27, 32], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24, 26], "scylla_reactor_util": 5, "At": [5, 14, 24, 25, 26], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25, 26], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 28, 29, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 34, 38], "tabl": [5, 6, 10, 16, 27, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 26, 33, 41], "give": [5, 13, 15], "strongli": [5, 41], "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 27, 30, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 26, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 32, 33], "mention": [5, 14], "previous": [5, 24, 25, 26], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 31, 33, 41], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "configurt": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "47": 6, "10": [6, 10, 14, 16], "44": 6, "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "32": 6, "29": 6, "25": [6, 19], "18": 6, "avoid": [6, 14, 19, 31, 41], "root": [6, 19, 22, 24, 25, 26], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 22, 24, 25, 26], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 30, 41], "higher": [6, 25, 30, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 27, 28, 29], "agent": [6, 7, 8, 9, 16, 19], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25, 26], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 38], "place": [6, 7, 8, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 28, 30, 31, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25, 26], "2019": [6, 16, 38], "reach": [6, 8, 12, 30, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 30, 31, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 29, 32, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 30, 31, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": 7, "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 27, 28, 29, 30, 31, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25, 26], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 34], "disk": [7, 10, 14, 19, 27, 29, 34], "possibl": [7, 10, 17, 41], "api": [7, 8, 21], "resolv": 7, "explicitli": [7, 14], "ca": 7, "optim": [7, 32, 38, 42], "drop": [7, 40, 41], "while": [7, 19, 21, 22, 24, 25, 26, 33], "cdc": 7, "request": [7, 17, 40], "how": [7, 8, 10, 14, 22, 24, 25, 26, 28, 29, 30, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25, 26], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 26, 29], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 28, 29, 30, 34, 35, 41], "abov": [8, 22, 24, 25, 26], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 30, 38, 41], "email": [9, 10], "slack": [9, 10, 18], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11], "wrong": [10, 11, 14, 19, 25, 39, 41], "shown": [10, 19, 22, 24, 25, 26], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "sever": [10, 13, 15, 42], "annot": 10, "descript": [10, 34], "been": [10, 12], "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "duplic": [10, 41], "rout": [10, 30, 41], "repres": 10, "tree": 10, "win": [10, 19], "inhibit": 10, "mute": 10, "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 28], "simul": 10, "actual": [10, 37], "low": [10, 41], "space": 10, "lower": [10, 41], "fire": 10, "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 32, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "shard": [12, 19, 25, 34], "dd": 12, "non": [12, 19, 21, 29, 30, 34, 38, 41], "cost": [12, 41], "skip": [12, 25], "care": [12, 27, 28, 29, 41], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "explain": [14, 22, 24, 25, 26, 34], "intern": [14, 30, 41], "potenti": [14, 34, 41], "issu": [14, 19, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "overridden": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "error": [14, 25, 34, 35, 37], "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 31, 41], "tooltip": 14, "msresolut": 14, "share": [14, 33], "sort": [14, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 31, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": 14, "usual": [14, 19, 34, 41], "easier": 14, "wrapper": 14, "re": [14, 30], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2023": 16, "2018": [16, 31], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "ask": 18, "question": 18, "discuss": 18, "forum": 18, "channel": 18, "56090": 19, "old": [19, 22, 23, 24, 25, 26], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": 19, "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 30, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 27, 28, 29, 31, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "dure": [19, 22, 24, 25, 26], "fallback": 19, "mechan": [19, 25, 28], "present": [19, 25], "newer": [19, 24, 25, 26], "reli": [19, 25, 41], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25, 26, 41], "increas": [19, 31, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25, 26], "migrat": [21, 22, 24, 26], "lose": 21, "histor": [21, 25], "process": [21, 33, 40], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25, 26], "3001": [21, 22, 24, 25, 26], "9091": [21, 22, 24, 25, 26], "9094": 21, "fail": [21, 28, 30, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25, 26], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25, 26], "back": [21, 28], "uninstal": [22, 24, 25, 26], "minor": [22, 24, 25, 26], "9095": [22, 24, 25, 26], "brows": [22, 24, 25, 26], "satisfi": [22, 24, 25, 26], "shut": [22, 24, 25, 26], "caus": [22, 24, 25, 26, 30, 41], "blackout": [22, 24, 25, 26], "normal": [22, 24, 25, 26], "oper": [22, 24, 25, 26, 34, 41], "complet": [22, 24, 25, 26], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25, 26], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 27, 34, 41], "ensur": 25, "patch": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 29], "latenc": [25, 30, 33, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 28], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 28, 29, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "primari": [27, 41], "kei": [27, 41], "scan": 27, "These": [27, 41], "kind": [27, 41], "bigger": 27, "replicationfactor": [28, 29], "piec": 28, "determin": [28, 29, 35, 41], "repli": [28, 29, 31, 35, 37, 41], "unavail": [28, 41], "client": [28, 31, 34, 41], "respond": 28, "accompani": 28, "deep": 28, "understand": 28, "acknowledg": 29, "coordin": [29, 30, 35, 37, 41], "hint": 29, "fact": 29, "yet": 29, "ideal": [30, 41], "resourc": [30, 41], "replic": [30, 35, 37, 41], "prepar": [30, 34, 38], "statement": [30, 32, 34, 38], "balanc": [30, 33, 34, 41], "polici": 30, "cours": 30, "intro": 30, "recap": 30, "ring": [30, 41], "architectur": 30, "chunk": [31, 41], "overal": [31, 33, 41], "thu": 31, "www": [31, 38], "07": 31, "13": 31, "effici": [31, 41], "concret": 32, "thumb": 32, "alwai": 32, "favor": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "practic": [34, 38], "solv": 34, "categori": [34, 41], "jump": 34, "warn": 34, "cell": 34, "model": [34, 38, 40, 41], "awar": 34, "due": 34, "unsatisfi": 34, "faulti": 34, "cach": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "bottleneck": 38, "explan": 38, "08": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "repair": 40, "que": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "prevent": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "order": 41, "BY": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13, 26], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 34, 42], "us": [2, 5, 6, 8, 12, 14, 27, 28, 29, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25, 26], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25, 26], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25, 26], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 31, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": [6, 17], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25, 26], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 26, 34, 41], "all": [7, 22, 24, 25, 26, 28], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25, 26], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 28, 29, 35, 41], "architectur": 9, "tip": 10, "when": 10, "ad": [10, 12, 14], "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25, 26], "modifi": 14, "limit": 14, "consist": [14, 28, 29, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25, 26], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25, 26], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25, 26], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25, 26], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25, 26], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 30, 31, 32, 38], "empti": 19, "reduc": 19, "total": 19, "number": 19, "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25, 26], "latest": 21, "new": [21, 22, 23, 24, 25, 26], "4": [21, 25, 26], "move": [21, 22, 24, 25, 26], "old": 21, "b": 21, "rollback": [21, 22, 23, 24, 25, 26], "link": [21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 38], "y": [22, 24, 25, 26], "": [22, 24, 25, 26], "i": [22, 24, 25, 26, 36], "run": [22, 24, 25, 26], "correct": [22, 24, 25, 26], "correctli": [22, 24, 26], "kill": [22, 24, 25, 26], "test": [24, 25, 26], "mode": [24, 25, 26], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "some": [27, 28, 29, 30, 31, 32, 35, 37], "allow": [27, 41], "filter": [27, 41], "univers": [28, 29, 30], "ani": 29, "token": [30, 41], "awar": [30, 41], "select": 31, "non": [31, 32], "page": [31, 41], "blog": [31, 38], "prepar": [32, 39, 41], "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "revers": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some SELECT queries are non-paged": [[31, "some-select-queries-are-non-paged"]], "Blog-post Links": [[31, "blog-post-links"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Some queries are non-prepared": [[32, "some-queries-are-non-prepared"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Some queries are not token-aware": [[30, "some-queries-are-not-token-aware"]], "University link": [[30, "university-link"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Upgrade Procedure": [[22, "upgrade-procedure"], [24, "upgrade-procedure"], [23, "upgrade-procedure"], [25, "upgrade-procedure"], [21, "upgrade-procedure"], [26, "upgrade-procedure"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Setting the server\u2019s files": [[22, "setting-the-server-s-files"], [24, "setting-the-server-s-files"], [25, "setting-the-server-s-files"], [26, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[22, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"], [26, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Kill all containers": [[22, "kill-all-containers"], [24, "kill-all-containers"], [25, "kill-all-containers"], [26, "kill-all-containers"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Related Links": [[22, "related-links"], [24, "related-links"], [23, "related-links"], [25, "related-links"], [21, "related-links"], [26, "related-links"]], "Some queries use ALLOW FILTERING": [[27, "some-queries-use-allow-filtering"]], "Some queries use Consistency Level: ALL": [[28, "some-queries-use-consistency-level-all"]], "Link to Scylla university": [[28, "link-to-scylla-university"], [29, "link-to-scylla-university"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"], [26, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"], [26, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"], [26, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Some queries use Consistency Level: ANY": [[29, "some-queries-use-consistency-level-any"]], "Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y": [[26, "upgrade-guide-scylladb-monitoring-4-x-to-scylladb-monitoring-4-y"]], "Rollback to version 4.x": [[26, "rollback-to-version-4-x"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[17, "prometheus-api"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "System Overload": [[40, "system-overload"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Minimal Production System Recommendations": [[6, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[6, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[6, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "ScyllaDB Monitoring Stack": [[1, "scylladb-monitoring-stack"], [9, "scylladb-monitoring-stack"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "High Level Architecture": [[9, "high-level-architecture"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.5/sitemap.xml b/branch-4.5/sitemap.xml new file mode 100644 index 000000000..34aab7f4c --- /dev/null +++ b/branch-4.5/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.5/troubleshooting/index.html b/branch-4.5/troubleshooting/index.html new file mode 100644 index 000000000..a82f88f3b --- /dev/null +++ b/branch-4.5/troubleshooting/index.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Troubleshooting Guide for Scylla Monitoring Stack

                              +
                              +
                              +

                              Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/troubleshooting/monitor-troubleshoot.html b/branch-4.5/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..d4294d979 --- /dev/null +++ b/branch-4.5/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,886 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Troubleshoot Scylla Monitoring Stack

                              +

                              This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                              +
                              +

                              Problem

                              +
                              +

                              Scylla-Manager 2.2 with Duplicate information

                              +

                              Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                              +
                                +
                              • For Manager server: from 56090 to 5090

                              • +
                              • For Manager Agent: from 56090 to 5090

                              • +
                              +

                              For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                              +

                              However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                              +

                              The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                              +

                              Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                              +
                              +
                              +

                              A Container Fails To Start

                              +

                              When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                              +
                              Wait for Prometheus container to start........Error: Prometheus container failed to start
                              +
                              +
                              +

                              Should this happen, check the Docker logs for more information.

                              +
                              docker logs aprom
                              +
                              +
                              +

                              Usually the reason for the failure is described in the logs.

                              +
                              +
                              +

                              Files And Directory Permissions

                              +
                              +

                              Note

                              +

                              Avoid running Docker containers as root.

                              +
                              +

                              The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                              +

                              If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                              +
                              +

                              Note

                              +

                              If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                              +
                              +

                              For example if your Prometheus data directory is /prom-data and you are using centos user

                              +
                              ls -la /|grep prom-data
                              +
                              +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                              +
                              +sudo chown -R centos:centos /prom-data
                              +
                              +ls -la /|grep prom-data
                              +
                              +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                              +
                              +
                              +
                              +
                              +

                              No Data Points

                              +

                              No data points on all data charts.

                              +
                              +

                              Solution

                              +

                              If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                              +
                                +
                              1. Login to the Prometheus console:

                              2. +
                              3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                              4. +
                              5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                              6. +
                              +
                              +
                                +
                              • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                              • +
                              • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                              • +
                              • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                              • +
                              +
                              +

                              For example:

                              +
                              ./start-all.sh -v 3.1
                              +
                              +
                              +

                              More on start-all.sh options.

                              +
                              +
                              +
                              +

                              Grafana Chart Shows Error (!) Sign

                              +

                              Run this procedure on the Scylla Monitoring Stack server.

                              +

                              If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                              +
                              +

                              Solution

                              +

                              On the Scylla Monitoring Stack server:

                              +
                                +
                              1. Check Prometheus is running using docker ps.

                              2. +
                              +
                                +
                              • If it is not running check the prometheus.yml for errors.

                              • +
                              +

                              For example:

                              +
                              CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                              +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                              +
                              +
                              +
                                +
                              • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                              • +
                              +
                              +
                              +
                              +

                              Grafana Shows Server Level Metrics, but not Scylla Metrics

                              +

                              Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                              +
                              +

                              Solution

                              +
                                +
                              • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                              • +
                              +

                              For example

                              +
                              curl 172.17.0.2:9180/metrics
                              +
                              +
                              +
                              +
                              +
                              +

                              Grafana Shows Scylla Metrics, but not Server Level Metrics

                              +

                              Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                              +
                              +

                              Solution

                              +

                              1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                              +
                                +
                              1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                              2. +
                              +
                              +
                              +

                              Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                              +

                              While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                              +

                              If the node_exporter service is not starting it may need to be updated manually.

                              +

                              Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                              +
                              +
                              +
                              +

                              Latencies Graphs Are empty

                              +

                              Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                              +

                              During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                              +

                              Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                              +

                              If only the latency graphs are missing, it is because of missing recording rules.

                              +

                              This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                              +

                              If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                              +
                              +
                              +

                              Reducing the total number of metrics

                              +

                              In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                              +
                              +

                              Remove interrupts from node_exporter

                              +

                              By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                              +
                              +
                              +
                              +

                              Working with Wireshark

                              +

                              No metrics shown in the Scylla Monitoring Stack.

                              +
                                +
                              1. Install wireshark

                              2. +
                              +

                              2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                              +

                              For example:

                              +
                              tshark -i eth0 -f "dst port 9180"
                              +
                              +
                              +

                              Capture from Scylla node towards Scylla Monitoring Stack server.

                              +

                              In this example, Scylla is running.

                              +
                              Monitor ip        Scylla node ip
                              +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                              +
                              +
                              +

                              In this example, Scylla is not running

                              +
                              Monitor ip        Scylla node ip
                              +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                              +
                              +
                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/index.html b/branch-4.5/upgrade/index.html new file mode 100644 index 000000000..9077909d3 --- /dev/null +++ b/branch-4.5/upgrade/index.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Scylla Monitoring Stack

                              +
                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..abff214b0 --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                              +

                              Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                              +
                              +

                              Upgrade Procedure

                              +
                              +

                              1. Upgrade to the latest 1.x version

                              +

                              Before starting the upgrade procedure, make sure you are running the latest 1.x version

                              +
                              +
                              +

                              2. Install the new monitoring stack

                              +
                                +
                              1. Download the 2.x version from the release page.

                              2. +
                              3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                              4. +
                              5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                                +
                                  +
                                • scylla_servers.yml

                                • +
                                • scylla_manager_servers.yml

                                • +
                                • node_exporter_servers.yml

                                • +
                                +
                              6. +
                              7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                              8. +
                              +
                              ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                              +
                              +
                              +
                              +

                              Note

                              +

                              Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                              +
                              +

                              While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                              +
                              ./kill-all.sh -g 3001 -p 9091 -m 9094
                              +
                              +
                              +
                              +

                              Validation

                              +

                              Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                              +
                              +
                              +
                              +

                              3. Alerting Rules

                              +

                              Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                              +
                              +
                              +

                              4. Moving to Prometheus 2.x

                              +

                              Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                              +

                              Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                              +
                              +

                              a. Set the old system

                              +

                              The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                              +
                                +
                              • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                              • +
                              • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                              • +
                              +
                              +

                              Note

                              +

                              After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                              +
                              +
                              +
                              +

                              b. Set the new system

                              +

                              The following step will allow the new monitoring system to read historical metrics from the old system.

                              +
                                +
                              • In the Prometheus prometheus.yml.template file add the following at the end:

                              • +
                              +
                              remote_read:
                              +  - url: "http://{ip}:9111/api/v1/read"
                              +
                              +
                              +

                              Where {ip} is the ip of the old system.

                              +
                                +
                              • restart the new stack

                              • +
                              +
                              +
                              +
                              +

                              Validate the upgrade

                              +

                              You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                              +
                              +
                              +
                              +

                              Rollback

                              +

                              In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..0108586e1 --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                              +
                              +

                              Upgrade Procedure

                              +

                              We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                              +

                              Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                              +
                              +

                              Install 2.y (The new version)

                              +
                              wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                              +unzip scylla-monitoring-2.y.zip
                              +cd scylla-monitoring-scylla-monitoring-2.y/
                              +
                              +
                              +

                              Replace “y” with the new minor release number, for example, 2.1.zip

                              +
                              +
                              +

                              Setting the server’s files

                              +

                              Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                              +
                              cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                              +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                              +
                              +
                              +
                              +
                              +

                              Validate the new version is running the correct version

                              +

                              Starting from Scylla-Monitoring version 2.2, you can run:

                              +
                              ./start-all.sh --version
                              +
                              +
                              +

                              To validate the Scylla-Monitoring version.

                              +
                              +
                              +

                              Validate the version installed correctly

                              +

                              To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                              +
                              ./start-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              Browse to http://{ip}:9091 +And check the Grafana dashboard

                              +

                              Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                              +
                              +

                              Caution

                              +

                              Important: do not use the local dir flag when testing!

                              +
                              +

                              When you are satisfied with the data in the dashboard, you can shut down the containers.

                              +
                              +

                              Caution

                              +

                              Important: Do not kill the 2.x version that is currently running.

                              +
                              +

                              Use the following command to kill the containers:

                              +
                              ./kill-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              You can start and stop the new 2.y version while testing.

                              +
                              +
                              +

                              Move to version 2.y (the new version)

                              +

                              Note: migrating will cause a few seconds of blackout in the system.

                              +

                              We assume that you are using external volume to store the metrics data.

                              +
                              +

                              Kill all containers

                              +

                              Follow the instruction on how to kill the 2.y version when in testing mode.

                              +

                              To kill the 2.x version containers, run:

                              +
                              ./kill-all.sh
                              +
                              +
                              +

                              Start version 2.y in normal mode

                              +

                              From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                              +
                              ./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +

                              Point your browser to http://{ip}:3000 and see that the data is there.

                              +
                              +
                              +
                              +

                              Rollback to version 2.x

                              +

                              To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                              +

                              To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                              +
                              ./kill-all.sh
                              +cd /path/to/scylla-grafana-2.x/
                              +./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +
                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..3590cced1 --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,752 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                              +

                              Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                              +
                              +

                              Upgrade Procedure

                              +
                              +

                              1. Validate node_exporter version

                              +

                              Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                              +

                              If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                              +
                              +
                              +

                              2. Install the new monitoring stack

                              +
                                +
                              1. Download the 3.x version from the release page.

                              2. +
                              3. Unzip it into a different directory.

                              4. +
                              5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                                +
                                  +
                                • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                                • +
                                • scylla_manager_servers.yml

                                • +
                                +
                                +
                                +

                                Note

                                +

                                The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                                +
                                +
                                +
                              6. +
                              7. Stop the old monitoring stack

                                +
                                +
                                ./kill-all.sh
                                +
                                +
                                +
                                +
                              8. +
                              9. Start the new monitoring stack

                                +
                                +
                                ./start-all.sh -d /prometheus-data-path
                                +
                                +
                                +
                                +
                              10. +
                              +
                              +
                              +

                              Validate the upgrade

                              +

                              You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                              +

                              Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                              +
                              +
                              +
                              +

                              Rollback

                              +

                              To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..d01f83ad8 --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                              +
                              +

                              Upgrade Procedure

                              +

                              We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                              +

                              Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                              +
                              +

                              Install 3.y (The new version)

                              +
                              wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                              +unzip scylla-monitoring-3.y.zip
                              +cd scylla-monitoring-scylla-monitoring-3.y/
                              +
                              +
                              +

                              Replace “y” with the new minor release number, for example, 3.0.1.zip

                              +
                              +
                              +

                              Setting the server’s files

                              +

                              Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                              +
                              cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                              +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                              +
                              +
                              +
                              +
                              +

                              Validate the new version is running the correct version

                              +

                              Starting from Scylla-Monitoring version 2.2, you can run:

                              +
                              ./start-all.sh --version
                              +
                              +
                              +

                              To validate the Scylla-Monitoring version.

                              +
                              +
                              +

                              Validate the version installed correctly

                              +

                              To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                              +
                              ./start-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              Browse to http://{ip}:9091 +And check the Grafana dashboard

                              +

                              Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                              +
                              +

                              Caution

                              +

                              Important: do not use the local dir flag when testing!

                              +
                              +

                              When you are satisfied with the data in the dashboard, you can shut down the containers.

                              +
                              +

                              Caution

                              +

                              Important: Do not kill the 3.x version that is currently running.

                              +
                              +
                              +
                              +

                              Killing the new 3.y Monitoring stack in testing mode

                              +

                              Use the following command to kill the containers:

                              +
                              ./kill-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              You can start and stop the new 3.y version while testing.

                              +
                              +
                              +

                              Move to version 3.y (the new version)

                              +

                              Note: migrating will cause a few seconds of blackout in the system.

                              +

                              We assume that you are using external volume to store the metrics data.

                              +
                              +

                              Kill all containers

                              +

                              At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                              +

                              Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                              +

                              kill the older 3.x version containers by running:

                              +
                              ./kill-all.sh
                              +
                              +
                              +

                              Start version 3.y in normal mode

                              +

                              From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                              +
                              ./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +

                              Point your browser to http://{ip}:3000 and see that the data is there.

                              +
                              +
                              +
                              +

                              Rollback to version 3.x

                              +

                              To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                              +

                              To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                              +
                              ./kill-all.sh
                              +cd /path/to/scylla-grafana-3.x/
                              +./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +
                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..a43ddcb2a --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,939 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                              +
                              +

                              Upgrade Procedure

                              +

                              We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                              +

                              Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                              +
                              +

                              Install 4.y (The new version)

                              +
                              wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                              +unzip scylla-monitoring-4.y.zip
                              +cd scylla-monitoring-scylla-monitoring-4.y/
                              +
                              +
                              +

                              Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                              +
                              +
                              +

                              Setting the server’s files

                              +

                              Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                              +
                              cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                              +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                              +
                              +
                              +
                              +
                              +

                              Validate the new version is running the correct version

                              +

                              run:

                              +
                              ./start-all.sh --version
                              +
                              +
                              +

                              To validate the Scylla-Monitoring version.

                              +
                              +
                              +
                              +

                              Running in test mode

                              +

                              This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                              +
                              +

                              Running second monitoring stack

                              +

                              We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                              +
                              ./start-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              Browse to http://{ip}:9091 and check the Grafana dashboard.

                              +

                              Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                              +
                              +

                              Caution

                              +

                              Important: do not use the local dir flag when testing!

                              +
                              +

                              When you are satisfied with the data in the dashboard, you can shut down the containers.

                              +
                              +

                              Caution

                              +

                              Important: Do not kill the 3.x version that is currently running!

                              +
                              +
                              +
                              +

                              Killing the new 4.y Monitoring stack in testing mode

                              +

                              Use the following command to kill the containers:

                              +
                              ./kill-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              You can start and stop the new 4.y version while testing.

                              +
                              +
                              +
                              +

                              Migrating

                              +
                              +

                              Move to version 4.y (the new version)

                              +

                              Note: migrating will cause a few seconds of blackout in the system.

                              +

                              We assume that you are using external volume to store the metrics data.

                              +
                              +

                              Backup

                              +

                              We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                              +
                              +
                              +

                              Kill all containers

                              +

                              At this point you have two monitoring stacks installed with the older version running.

                              +

                              If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                              +

                              kill the older 3.x version containers by running:

                              +
                              ./kill-all.sh
                              +
                              +
                              +

                              Start version 4.y in normal mode

                              +

                              From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                              +
                              ./start-all.sh -d /path/to/copy/data/dir
                              +
                              +
                              +

                              Point your browser to http://{ip}:3000 and see that the data is there.

                              +
                              +
                              +
                              +

                              Rollback to version 3.x

                              +

                              To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                              +

                              To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                              +
                              ./kill-all.sh
                              +cd /path/to/scylla-grafana-3.x/
                              +./start-all.sh -d /path/to/original/data/dir
                              +
                              +
                              +
                              +
                              +
                              +

                              Post-installation: Metrics back-filling

                              +

                              Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                              +

                              For example, this is a recording rule that calculates the p99 write latency:

                              +
                              - record: wlatencyp99
                              +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                              +  labels:
                              +    by: "instance,shard"
                              +
                              +
                              +

                              For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                              +

                              Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                              +
                              +
                              +

                              Note

                              +

                              If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                              +
                              +
                              +
                              +../_images/before-backfilling.png +
                              +

                              This is an example of missing latency graph

                              +
                              +
                              +

                              The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                              +

                              For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                              +

                              In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                              +

                              The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                              +
                              +

                              Determine the backfilling period

                              +

                              When you run the backfilling process you need to determine the start time and end time.

                              +
                              +

                              Determine the start time

                              +

                              The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                              +

                              If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                              +

                              For the rest of this example, we will assume that your retention time is 360 days.

                              +
                              +
                              +

                              Determine the end time

                              +

                              Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                              +

                              If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                              +

                              That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                              +

                              The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                              +
                              +
                              +
                              +

                              Backfilling Process

                              +
                              +

                              backup

                              +

                              If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                              +

                              To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                              +
                              +
                              +

                              Restart the monitoring stack

                              +

                              You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                              +

                              -b "--storage.tsdb.allow-overlapping-blocks"

                              +
                              +
                              +

                              Create the data files

                              +

                              We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                              +

                              The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                              +

                              Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                              +
                              docker exec -it aprom sh
                              +cd /prometheus/data/
                              +promtool tsdb create-blocks-from rules \
                              +--start $start \
                              +--end $end \
                              +--url http://localhost:9090 \
                              +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                              +
                              +
                              +

                              It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                              +
                              +
                              +

                              Note

                              +

                              Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                              +
                              +
                              +
                              +
                              +

                              Copy the data files

                              +

                              Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                              +

                              Copy the data files to the Prometheus directory:

                              +
                              cp data/* .
                              +
                              +
                              +

                              The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                              +

                              Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                              +
                              +../_images/after-backfilling.jpg +
                              +

                              Un example: after loading half of the data

                              +
                              +
                              +
                              +
                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/branch-4.5/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..278d87a62 --- /dev/null +++ b/branch-4.5/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,797 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Upgrade Guide - ScyllaDB Monitoring 4.x to ScyllaDB Monitoring 4.y

                              +

                              This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x to 4.y, for example, between 4.0 to 4.0.1.

                              +
                              +

                              Upgrade Procedure

                              +

                              We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                              +

                              Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                              +
                              +

                              Install 4.y (The new version)

                              +
                              wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                              +unzip scylla-monitoring-4.y.zip
                              +cd scylla-monitoring-scylla-monitoring-4.y/
                              +
                              +
                              +

                              Replace “y” with the new minor release number, for example, 4.0.1.zip

                              +
                              +
                              +

                              Setting the server’s files

                              +

                              Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                              +
                              cp /path/to/monitoring/4.x/prometheus/scylla_servers.yml prometheus/
                              +cp /path/to/monitoring/4.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                              +
                              +
                              +
                              +
                              +

                              Validate the new version is running the correct version

                              +

                              Run:

                              +
                              ./start-all.sh --version
                              +
                              +
                              +

                              To validate the Scylla-Monitoring version.

                              +
                              +
                              +

                              Validate the version installed correctly

                              +

                              To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x) stack.

                              +
                              ./start-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              Browse to http://{ip}:9091 +And check the Grafana dashboard

                              +

                              Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                              +
                              +

                              Caution

                              +

                              Important: do not use the local dir flag when testing!

                              +
                              +

                              When you are satisfied with the data in the dashboard, you can shut down the containers.

                              +
                              +

                              Caution

                              +

                              Important: Do not kill the 4.x version that is currently running.

                              +
                              +
                              +
                              +

                              Killing the new 4.y Monitoring stack in testing mode

                              +

                              Use the following command to kill the containers:

                              +
                              ./kill-all.sh -p 9091 -g 3001 -m 9095
                              +
                              +
                              +

                              You can start and stop the new 4.y version while testing.

                              +
                              +
                              +

                              Move to version 4.y (the new version)

                              +

                              Note: migrating will cause a few seconds of blackout in the system.

                              +

                              We assume that you are using external volume to store the metrics data.

                              +
                              +

                              Kill all containers

                              +

                              At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                              +

                              Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section

                              +

                              kill the older 4.x version containers by running:

                              +
                              ./kill-all.sh
                              +
                              +
                              +

                              Start version 4.y in normal mode

                              +

                              From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                              +
                              ./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +

                              Point your browser to http://{ip}:3000 and see that the data is there.

                              +
                              +
                              +
                              +

                              Rollback to version 4.x

                              +

                              To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                              +

                              To rollback to version 4.x after you completed the moving to version 4.y (as shown above). +Run:

                              +
                              ./kill-all.sh
                              +cd /path/to/scylla-grafana-4.x/
                              +./start-all.sh -d /path/to/data/dir
                              +
                              +
                              +
                              +
                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.5/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..32934de10 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries use ALLOW FILTERING

                              +

                              Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                              +

                              These kinds of queries can create a bigger load on Scylla, and should be used with care.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlCLAll.html b/branch-4.5/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..810867c27 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries use Consistency Level: ALL

                              +

                              Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                              +

                              Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                              +

                              Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlCLAny.html b/branch-4.5/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..03387207e --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries use Consistency Level: ANY

                              +

                              Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                              +

                              Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.5/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..72af173ed --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries are not token-aware

                              +

                              Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                              +

                              Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlNonPaged.html b/branch-4.5/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..6c47fc82e --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some SELECT queries are non-paged

                              +

                              By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                              +
                              +

                              Blog-post Links

                              +

                              https://www.scylladb.com/2018/07/13/efficient-query-paging/

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.5/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..d46898ac5 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Some queries are non-prepared

                              +

                              Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/heavyCompaction.html b/branch-4.5/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..1be433d25 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Compaction takes lots of memory and CPU

                              +

                              ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                              +

                              If this is the case, you can do one of the following:

                              +
                                +
                              • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                                +
                                +
                                  +
                                • In the scylla.yml configuration file: compaction_static_shares: 100

                                • +
                                • In the command line when starting ScyllaDB: --compaction-static-shares 100

                                • +
                                +
                                +

                                You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                                +
                              • +
                              • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                              • +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/index.html b/branch-4.5/use-monitoring/advisor/index.html new file mode 100644 index 000000000..79f9c51a0 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/index.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Scylla Monitoring Stack Advisor

                              +
                              +
                              +

                              The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                              +
                              +

                              The Advisor section

                              +
                              +../../_images/advisor_panel.png +
                              +

                              The Advisor section

                              +
                              +
                              +

                              The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                              +

                              For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                              +

                              Each Advisor issue is explained in detail:

                              + +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/nodeCLErrors.html b/branch-4.5/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..883bb164e --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Some operation failed due to unsatisfied consistency level

                              +

                              ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                              +

                              For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                              +

                              When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/nodeIOErrors.html b/branch-4.5/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..0f7d395ab --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              I/O Errors can indicate a node with a faulty disk

                              +

                              I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.5/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..1ecdb2e88 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Some operations failed on the replica side

                              +

                              ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                              +

                              An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.5/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..b982d45b5 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              CQL queries are not balanced among shards

                              +

                              For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                              +

                              There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                              +
                              +

                              Blog post link

                              +

                              https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.5/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..8fbab3481 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              Prepared statements cache eviction

                              +

                              Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                              +
                                +
                              • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                              • +
                              • The prepared statements cache might be too small for the number of prepared statements.

                              • +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/advisor/systemOverload.html b/branch-4.5/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..ba0021236 --- /dev/null +++ b/branch-4.5/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              System Overload

                              +

                              There could be multiple indications that a system is overloaded:

                              +
                                +
                              • Timeouts

                              • +
                              • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                              • +
                              • CPU at 100% when no background process (like compaction or repair) runs.

                              • +
                              • Ques are getting filled.

                              • +
                              +

                              If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/cql-optimization.html b/branch-4.5/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..2c574e0fd --- /dev/null +++ b/branch-4.5/use-monitoring/cql-optimization.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + + + +
                              +

                              The CQL Optimization

                              +

                              The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                              +
                              +../_images/cql_optimization_master.png +
                              +

                              The CQL Dashboard

                              +
                              +
                              +

                              The upper part of the dashboard holds CQL related metrics.

                              +

                              The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                              +
                              +

                              Note

                              +

                              Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                              +
                              +

                              The following sections describe each of the dashboard’s panel

                              +
                              +

                              Prepared Statements

                              +

                              Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                              +

                              Using prepared statements has the following benefits:

                              +
                                +
                              • The database only needs to parse the query once

                              • +
                              • The driver can route the query to the right node

                              • +
                              • Using place-holders and values is safer and prevents CQL-Injection

                              • +
                              +

                              The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                              +

                              The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                              +
                              +
                              +

                              Token Aware

                              +

                              Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                              +

                              Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                              +

                              The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                              +

                              The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                              +
                              +
                              +

                              Paged Queries

                              +

                              By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                              +

                              The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                              +

                              The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                              +
                              +
                              +

                              Reversed CQL Reads

                              +

                              ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                              +

                              We strongly recommend using use the correct ordering. +Querying with an order different than the order the CLUSTERING ORDER BY was defined is supported, but not advisable.

                              +

                              For example, look at the following table:

                              +
                              CREATE TABLE ks1.table_demo (
                              +   category text,
                              +   type int,
                              +   PRIMARY KEY (category, type))
                              +WITH CLUSTERING ORDER BY (type DESC);
                              +
                              +
                              +

                              The following query uses reverse order:

                              +
                              select * from ks1.table_demo where category='cat1' order by type ASC;
                              +
                              +
                              +

                              The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                              +

                              The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                              +
                              +
                              +

                              ALLOW FILTERING

                              +

                              Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                              +

                              These kinds of queries can create a big load on the system, and should be used with care.

                              +

                              The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                              +

                              The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                              +

                              The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                              +

                              The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                              +

                              The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                              +
                              +
                              +

                              Consistency Level

                              +

                              Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                              +

                              The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                              +

                              Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                              +

                              The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                              +

                              The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                              +

                              The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                              +

                              The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                              +
                              +
                              +

                              Cross DC

                              +

                              Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                              +
                              +
                              +

                              Cross DC Consistency Level

                              +

                              Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                              +
                              +
                              +

                              Cross DC read requests

                              +
                              +

                              Note

                              +

                              The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                              +
                              +

                              In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                              +

                              The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                              +
                              +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.5/use-monitoring/index.html b/branch-4.5/use-monitoring/index.html new file mode 100644 index 000000000..63def9452 --- /dev/null +++ b/branch-4.5/use-monitoring/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + +
                              +
                              + Menu +
                              +
                              +
                              +
                              +
                              + + +
                              +

                              Caution

                              +

                              + + You're viewing documentation for a previous version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                              +
                              + + + +
                              + +
                              + +
                              +

                              Using Scylla Monitoring Stack

                              +
                              +
                              +

                              There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                              + +
                              + + +
                              + + + + + + + +
                              + +
                              + + + + +
                              + + + + + + + \ No newline at end of file diff --git a/branch-4.6/.buildinfo b/branch-4.6/.buildinfo new file mode 100644 index 000000000..30d137fdc --- /dev/null +++ b/branch-4.6/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 0e7f732cdc46a695b064c8436421d5c2 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/branch-4.6/.doctrees/common/monitor-description.doctree b/branch-4.6/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..75fad65ab Binary files /dev/null and b/branch-4.6/.doctrees/common/monitor-description.doctree differ diff --git a/branch-4.6/.doctrees/environment.pickle b/branch-4.6/.doctrees/environment.pickle new file mode 100644 index 000000000..88ddc1866 Binary files /dev/null and b/branch-4.6/.doctrees/environment.pickle differ diff --git a/branch-4.6/.doctrees/index.doctree b/branch-4.6/.doctrees/index.doctree new file mode 100644 index 000000000..876b6e785 Binary files /dev/null and b/branch-4.6/.doctrees/index.doctree differ diff --git a/branch-4.6/.doctrees/install/docker-compose.doctree b/branch-4.6/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..fe56618aa Binary files /dev/null and b/branch-4.6/.doctrees/install/docker-compose.doctree differ diff --git a/branch-4.6/.doctrees/install/index.doctree b/branch-4.6/.doctrees/install/index.doctree new file mode 100644 index 000000000..84c6ee62b Binary files /dev/null and b/branch-4.6/.doctrees/install/index.doctree differ diff --git a/branch-4.6/.doctrees/install/min-prod-hw.doctree b/branch-4.6/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..acb21656c Binary files /dev/null and b/branch-4.6/.doctrees/install/min-prod-hw.doctree differ diff --git a/branch-4.6/.doctrees/install/monitor-without-docker.doctree b/branch-4.6/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..41d3ec98e Binary files /dev/null and b/branch-4.6/.doctrees/install/monitor-without-docker.doctree differ diff --git a/branch-4.6/.doctrees/install/monitoring-stack.doctree b/branch-4.6/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..aa7fef80b Binary files /dev/null and b/branch-4.6/.doctrees/install/monitoring-stack.doctree differ diff --git a/branch-4.6/.doctrees/install/start-all.doctree b/branch-4.6/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..e649dedc3 Binary files /dev/null and b/branch-4.6/.doctrees/install/start-all.doctree differ diff --git a/branch-4.6/.doctrees/install/thanos.doctree b/branch-4.6/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..bd13b9719 Binary files /dev/null and b/branch-4.6/.doctrees/install/thanos.doctree differ diff --git a/branch-4.6/.doctrees/intro.doctree b/branch-4.6/.doctrees/intro.doctree new file mode 100644 index 000000000..f009cbf42 Binary files /dev/null and b/branch-4.6/.doctrees/intro.doctree differ diff --git a/branch-4.6/.doctrees/procedures/alerts/alerting.doctree b/branch-4.6/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..237e599d9 Binary files /dev/null and b/branch-4.6/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/branch-4.6/.doctrees/procedures/alerts/index.doctree b/branch-4.6/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..c54aff500 Binary files /dev/null and b/branch-4.6/.doctrees/procedures/alerts/index.doctree differ diff --git a/branch-4.6/.doctrees/procedures/datadog/index.doctree b/branch-4.6/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..b3359785e Binary files /dev/null and b/branch-4.6/.doctrees/procedures/datadog/index.doctree differ diff --git a/branch-4.6/.doctrees/procedures/index.doctree b/branch-4.6/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..6a1a7aaae Binary files /dev/null and b/branch-4.6/.doctrees/procedures/index.doctree differ diff --git a/branch-4.6/.doctrees/procedures/updating-dashboard.doctree b/branch-4.6/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..645bb14b1 Binary files /dev/null and b/branch-4.6/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/branch-4.6/.doctrees/reference/index.doctree b/branch-4.6/.doctrees/reference/index.doctree new file mode 100644 index 000000000..c0a5a4211 Binary files /dev/null and b/branch-4.6/.doctrees/reference/index.doctree differ diff --git a/branch-4.6/.doctrees/reference/matrix.doctree b/branch-4.6/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..b3b56d8ef Binary files /dev/null and b/branch-4.6/.doctrees/reference/matrix.doctree differ diff --git a/branch-4.6/.doctrees/reference/monitoring-apis.doctree b/branch-4.6/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..896ae1c5f Binary files /dev/null and b/branch-4.6/.doctrees/reference/monitoring-apis.doctree differ diff --git a/branch-4.6/.doctrees/troubleshooting/index.doctree b/branch-4.6/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..502f92ee7 Binary files /dev/null and b/branch-4.6/.doctrees/troubleshooting/index.doctree differ diff --git a/branch-4.6/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/branch-4.6/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..1c407eed0 Binary files /dev/null and b/branch-4.6/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/index.doctree b/branch-4.6/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..45cc82851 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/index.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..c40625f94 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..1d41f2f36 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..fa39db804 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..2c1b55a99 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..349ed7bb2 Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..2932387bc Binary files /dev/null and b/branch-4.6/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..9a32233e7 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..a3df77fb5 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..9381fd493 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..600c3a6d3 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..d7460037e Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..3abba7b65 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..edf23f1de Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/index.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..10a554cb6 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..2a46e01c3 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..703a72773 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..b5fd393e8 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..1d9b42cc6 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..aa768ecf0 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/advisor/systemOverload.doctree b/branch-4.6/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..9278fae11 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/cql-optimization.doctree b/branch-4.6/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..240f7fbaa Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/branch-4.6/.doctrees/use-monitoring/index.doctree b/branch-4.6/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..04e60c4d1 Binary files /dev/null and b/branch-4.6/.doctrees/use-monitoring/index.doctree differ diff --git a/branch-4.6/.nojekyll b/branch-4.6/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/branch-4.6/404.html b/branch-4.6/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/branch-4.6/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                              +

                              404

                              +

                              The ScyllaDB monster ate your page!

                              +

                              + Home +

                              +
                              + + + \ No newline at end of file diff --git a/branch-4.6/CNAME b/branch-4.6/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/branch-4.6/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/branch-4.6/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/branch-4.6/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..3e85b60ab --- /dev/null +++ b/branch-4.6/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,576 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" diff --git a/branch-4.6/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/branch-4.6/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/branch-4.6/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/branch-4.6/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/branch-4.6/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/branch-4.6/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.6/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/branch-4.6/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/branch-4.6/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/branch-4.6/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/branch-4.6/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/branch-4.6/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/branch-4.6/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/branch-4.6/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/branch-4.6/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/branch-4.6/_images/1.png b/branch-4.6/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/branch-4.6/_images/1.png differ diff --git a/branch-4.6/_images/2.png b/branch-4.6/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/branch-4.6/_images/2.png differ diff --git a/branch-4.6/_images/3.png b/branch-4.6/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/branch-4.6/_images/3.png differ diff --git a/branch-4.6/_images/advisor_panel.png b/branch-4.6/_images/advisor_panel.png new file mode 100644 index 000000000..89b9a5950 Binary files /dev/null and b/branch-4.6/_images/advisor_panel.png differ diff --git a/branch-4.6/_images/after-backfilling.jpg b/branch-4.6/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/branch-4.6/_images/after-backfilling.jpg differ diff --git a/branch-4.6/_images/alertmanager.png b/branch-4.6/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/branch-4.6/_images/alertmanager.png differ diff --git a/branch-4.6/_images/before-backfilling.png b/branch-4.6/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/branch-4.6/_images/before-backfilling.png differ diff --git a/branch-4.6/_images/cql_optimization_master.png b/branch-4.6/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/branch-4.6/_images/cql_optimization_master.png differ diff --git a/branch-4.6/_images/datadog.png b/branch-4.6/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/branch-4.6/_images/datadog.png differ diff --git a/branch-4.6/_images/grafana.png b/branch-4.6/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/branch-4.6/_images/grafana.png differ diff --git a/branch-4.6/_images/monitor.png b/branch-4.6/_images/monitor.png new file mode 100644 index 000000000..cf691ecb3 Binary files /dev/null and b/branch-4.6/_images/monitor.png differ diff --git a/branch-4.6/_images/monitoring_stack.png b/branch-4.6/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/branch-4.6/_images/monitoring_stack.png differ diff --git a/branch-4.6/_images/monitoring_stack1.png b/branch-4.6/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/branch-4.6/_images/monitoring_stack1.png differ diff --git a/branch-4.6/_sources/common/monitor-description.rst.txt b/branch-4.6/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/branch-4.6/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/branch-4.6/_sources/index.rst.txt b/branch-4.6/_sources/index.rst.txt new file mode 100644 index 000000000..3dbe94edd --- /dev/null +++ b/branch-4.6/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/branch-4.6/_sources/install/docker-compose.rst.txt b/branch-4.6/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/branch-4.6/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/branch-4.6/_sources/install/index.rst.txt b/branch-4.6/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/branch-4.6/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/branch-4.6/_sources/install/min-prod-hw.rst.txt b/branch-4.6/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/branch-4.6/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                              + + + + + + + + + + + +
                              # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                              00
                              + +
                              + \ No newline at end of file diff --git a/branch-4.6/_sources/install/monitor-without-docker.rst.txt b/branch-4.6/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..02cdaef2e --- /dev/null +++ b/branch-4.6/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                              `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configuration`_. + +.. _`grafana configuration`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/branch-4.6/_sources/install/monitoring-stack.rst.txt b/branch-4.6/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..5843f351a --- /dev/null +++ b/branch-4.6/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,412 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                              `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.6 + - 2.48.1 + - 10.2.2 + * - 4.5 + - 2.47.1 + - 10.1.5 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/branch-4.6/_sources/install/start-all.rst.txt b/branch-4.6/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..f270d092f --- /dev/null +++ b/branch-4.6/_sources/install/start-all.rst.txt @@ -0,0 +1,107 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +**--compose** This is an experimental option. When set, it initiates a two-stage process. Firstly, a ``docker-compose.yml`` file is created along with an ``.env`` file. Following this, the script executes ``docker-compose up``. Please note that having docker-compose is a prerequisite. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/branch-4.6/_sources/install/thanos.rst.txt b/branch-4.6/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/branch-4.6/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/branch-4.6/_sources/intro.rst.txt b/branch-4.6/_sources/intro.rst.txt new file mode 100644 index 000000000..78481f6c3 --- /dev/null +++ b/branch-4.6/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/branch-4.6/_sources/procedures/alerts/alerting.rst.txt b/branch-4.6/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..d196123bc --- /dev/null +++ b/branch-4.6/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,114 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in files placed under `prometheus/prom_rules/`. Prometheus will load any file that ends with `yml` or `yaml`. + +Each Prometheus alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "error" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **error**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alerts severity +--------------- + +Prometheus uses the following severities from low to high: **info**, **warn**, **error**, **critical**. + +The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the **error** alert for disk-full is firing, it silences the **warn** alert. + +When adding your own alerts, you can use the severities to signal the action's importance, for example **critical** would be a pager-duty, while an **error** will be an email. + +Adding Alerts +---------------- + +Add your own alerts in a separate file with a **yml** or **yaml** extension. Making it easier during upgrade. + +Modifying Alerts +---------------- + +It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/branch-4.6/_sources/procedures/alerts/index.rst.txt b/branch-4.6/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/branch-4.6/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/branch-4.6/_sources/procedures/datadog/index.rst.txt b/branch-4.6/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bcc4e9b7 --- /dev/null +++ b/branch-4.6/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,68 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non Scylla Cloud users, download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Cloud users, skip this step, it's been take care for by the cloud. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/branch-4.6/_sources/procedures/index.rst.txt b/branch-4.6/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..76a24002a --- /dev/null +++ b/branch-4.6/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/branch-4.6/_sources/procedures/updating-dashboard.rst.txt b/branch-4.6/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/branch-4.6/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/branch-4.6/_sources/reference/index.rst.txt b/branch-4.6/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/branch-4.6/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/branch-4.6/_sources/reference/matrix.rst.txt b/branch-4.6/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..c5e722bbf --- /dev/null +++ b/branch-4.6/_sources/reference/matrix.rst.txt @@ -0,0 +1,160 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.6 + - 5.2, 5.4 + - 2021.1, 2022.1, 2022.2, 2023.1, 2024.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/branch-4.6/_sources/reference/monitoring-apis.rst.txt b/branch-4.6/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/branch-4.6/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/branch-4.6/_sources/troubleshooting/index.rst.txt b/branch-4.6/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..fa1b25a10 --- /dev/null +++ b/branch-4.6/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,16 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* You can ask questions and discuss the ScyllaDB Monitoring Stack in the `ScyllaDB community forum `_ and on the `Slack channel `_. \ No newline at end of file diff --git a/branch-4.6/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/branch-4.6/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/branch-4.6/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/branch-4.6/_sources/upgrade/index.rst.txt b/branch-4.6/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/branch-4.6/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                              +
                              +
                              +
                              Upgrade Scylla Open Source
                              +
                              +
                              + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                              +
                              +
                              diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..95cec1d4e --- /dev/null +++ b/branch-4.6/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,150 @@ +====================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b +====================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y.b (The new version) +------------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip + unzip scylla-monitoring-4.y.b.zip + cd scylla-monitoring-scylla-monitoring-4.y.b/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the target files ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the port numbers +^^^^^^^^^^^^^^^^^^^^^^^^^ +ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent. + +Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target. + +.. caution:: + + As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics. + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x.a version that is currently running. + +Killing the new 4.y.b Monitoring stack in testing mode +------------------------------------------------------ + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y.b version while testing. + +Move to version 4.y.b (the new version) +--------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y.b Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x.a version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y.b in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y.b` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x.a +------------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y.b Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x.a/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..f86568a31 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,11 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/branch-4.6/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/branch-4.6/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/branch-4.6/_sources/use-monitoring/advisor/index.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..06fc98c5f --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,37 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/branch-4.6/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/branch-4.6/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/branch-4.6/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/branch-4.6/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/branch-4.6/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/branch-4.6/_sources/use-monitoring/advisor/systemOverload.rst.txt b/branch-4.6/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..ac0b7d62f --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Queues are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/branch-4.6/_sources/use-monitoring/cql-optimization.rst.txt b/branch-4.6/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..7ac8b2284 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,155 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +We strongly recommend using use the correct ordering. +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is supported, but not advisable. + + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/branch-4.6/_sources/use-monitoring/index.rst.txt b/branch-4.6/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/branch-4.6/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/branch-4.6/_static/basic.css b/branch-4.6/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/branch-4.6/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/branch-4.6/_static/check-solid.svg b/branch-4.6/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/branch-4.6/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.6/_static/clipboard.min.js b/branch-4.6/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/branch-4.6/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/branch-4.6/_static/copybutton.css b/branch-4.6/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/branch-4.6/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                              Short

                              + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/branch-4.6/_static/copybutton.js b/branch-4.6/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/branch-4.6/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/branch-4.6/_static/copybutton_funcs.js b/branch-4.6/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/branch-4.6/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/branch-4.6/_static/css/main.css b/branch-4.6/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/branch-4.6/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/branch-4.6/_static/doctools.js b/branch-4.6/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/branch-4.6/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/branch-4.6/_static/documentation_options.js b/branch-4.6/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/branch-4.6/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/branch-4.6/_static/file.png b/branch-4.6/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/branch-4.6/_static/file.png differ diff --git a/branch-4.6/_static/img/banner-background.svg b/branch-4.6/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/branch-4.6/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.6/_static/img/favicon-228x228.png b/branch-4.6/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/branch-4.6/_static/img/favicon-228x228.png differ diff --git a/branch-4.6/_static/img/favicon-32x32.png b/branch-4.6/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/branch-4.6/_static/img/favicon-32x32.png differ diff --git a/branch-4.6/_static/img/favicon.ico b/branch-4.6/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/branch-4.6/_static/img/favicon.ico differ diff --git a/branch-4.6/_static/img/icons/icon-about-team.svg b/branch-4.6/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/branch-4.6/_static/img/icons/icon-about-us-m.svg b/branch-4.6/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-about-us.svg b/branch-4.6/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-alternator.svg b/branch-4.6/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-apps.svg b/branch-4.6/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-architecture.svg b/branch-4.6/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/branch-4.6/_static/img/icons/icon-benchmarks.svg b/branch-4.6/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/branch-4.6/_static/img/icons/icon-blog.svg b/branch-4.6/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/branch-4.6/_static/img/icons/icon-careers.svg b/branch-4.6/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/branch-4.6/_static/img/icons/icon-chevron-left.svg b/branch-4.6/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.6/_static/img/icons/icon-chevron-right.svg b/branch-4.6/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.6/_static/img/icons/icon-circe.svg b/branch-4.6/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-clock.svg b/branch-4.6/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-close.svg b/branch-4.6/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-cloud-docs.svg b/branch-4.6/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-cloud.svg b/branch-4.6/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-comparison.svg b/branch-4.6/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/branch-4.6/_static/img/icons/icon-contact-us.svg b/branch-4.6/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/branch-4.6/_static/img/icons/icon-developers-blog.svg b/branch-4.6/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/branch-4.6/_static/img/icons/icon-docs.svg b/branch-4.6/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/branch-4.6/_static/img/icons/icon-enterprise-m.svg b/branch-4.6/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-enterprise.svg b/branch-4.6/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-events.svg b/branch-4.6/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/branch-4.6/_static/img/icons/icon-exclamation.svg b/branch-4.6/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-expand.svg b/branch-4.6/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-forum.svg b/branch-4.6/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-getting-started.svg b/branch-4.6/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-glossary.svg b/branch-4.6/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-home.svg b/branch-4.6/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-infoworld.svg b/branch-4.6/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/branch-4.6/_static/img/icons/icon-integrations.svg b/branch-4.6/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-knowledge-base.svg b/branch-4.6/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-less.svg b/branch-4.6/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-live-test.svg b/branch-4.6/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/branch-4.6/_static/img/icons/icon-mail-list.svg b/branch-4.6/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-manager.svg b/branch-4.6/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/branch-4.6/_static/img/icons/icon-memory-management.svg b/branch-4.6/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/branch-4.6/_static/img/icons/icon-modeling.svg b/branch-4.6/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-monitoring.svg b/branch-4.6/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/branch-4.6/_static/img/icons/icon-networking.svg b/branch-4.6/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/branch-4.6/_static/img/icons/icon-news.svg b/branch-4.6/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/branch-4.6/_static/img/icons/icon-newsletter.svg b/branch-4.6/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/branch-4.6/_static/img/icons/icon-nsql-guides.svg b/branch-4.6/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/branch-4.6/_static/img/icons/icon-open-source.svg b/branch-4.6/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/branch-4.6/_static/img/icons/icon-operator.svg b/branch-4.6/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-overview.svg b/branch-4.6/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/branch-4.6/_static/img/icons/icon-partners.svg b/branch-4.6/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/branch-4.6/_static/img/icons/icon-plus.svg b/branch-4.6/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-pricing.svg b/branch-4.6/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/branch-4.6/_static/img/icons/icon-release-notes.svg b/branch-4.6/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/branch-4.6/_static/img/icons/icon-resource-center.svg b/branch-4.6/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/branch-4.6/_static/img/icons/icon-roadmap.svg b/branch-4.6/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/branch-4.6/_static/img/icons/icon-search.svg b/branch-4.6/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.6/_static/img/icons/icon-slack.svg b/branch-4.6/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-stack-overflow.svg b/branch-4.6/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/branch-4.6/_static/img/icons/icon-summit.svg b/branch-4.6/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/icons/icon-support.svg b/branch-4.6/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/branch-4.6/_static/img/icons/icon-tech-talks.svg b/branch-4.6/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/branch-4.6/_static/img/icons/icon-testing.svg b/branch-4.6/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/branch-4.6/_static/img/icons/icon-thumbs-down.svg b/branch-4.6/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-thumbs-up.svg b/branch-4.6/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branch-4.6/_static/img/icons/icon-tip.svg b/branch-4.6/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/branch-4.6/_static/img/icons/icon-training.svg b/branch-4.6/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/branch-4.6/_static/img/icons/icon-triangle-down.svg b/branch-4.6/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.6/_static/img/icons/icon-university.svg b/branch-4.6/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/branch-4.6/_static/img/icons/icon-users-blog.svg b/branch-4.6/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/branch-4.6/_static/img/icons/icon-warning.svg b/branch-4.6/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/branch-4.6/_static/img/icons/icon-webinars.svg b/branch-4.6/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/branch-4.6/_static/img/icons/icon-whitepapers.svg b/branch-4.6/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/branch-4.6/_static/img/icons/icon-workshop.svg b/branch-4.6/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/branch-4.6/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/branch-4.6/_static/img/logo-docs.svg b/branch-4.6/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/branch-4.6/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.6/_static/img/logo-scylla-horizontal-RGB.svg b/branch-4.6/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/branch-4.6/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branch-4.6/_static/img/mascots/404.jpg b/branch-4.6/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/branch-4.6/_static/img/mascots/404.jpg differ diff --git a/branch-4.6/_static/img/mascots/scylla-3monsters.png b/branch-4.6/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-3monsters.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-advisor-crystal.png b/branch-4.6/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-alternator.svg b/branch-4.6/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/branch-4.6/_static/img/mascots/scylla-cloud.svg b/branch-4.6/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/branch-4.6/_static/img/mascots/scylla-computer-3-monsters.png b/branch-4.6/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-computer-headset.png b/branch-4.6/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-computer-headset.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-cup-number-one.png b/branch-4.6/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-docs.svg b/branch-4.6/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/branch-4.6/_static/img/mascots/scylla-drivers.svg b/branch-4.6/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/branch-4.6/_static/img/mascots/scylla-enterprise.svg b/branch-4.6/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/branch-4.6/_static/img/mascots/scylla-forklift-boxes.png b/branch-4.6/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-forklift-migration.png b/branch-4.6/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-gear.png b/branch-4.6/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-gear.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-hardhat.png b/branch-4.6/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-hardhat.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-headband.png b/branch-4.6/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-headband.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-headset.png b/branch-4.6/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-headset.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-hearts.png b/branch-4.6/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-hearts.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-looking-down.png b/branch-4.6/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-looking-down.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-looking-up.png b/branch-4.6/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-looking-up.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-magnifying-glass-fronting.png b/branch-4.6/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-magnifying-glass.png b/branch-4.6/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-manager.svg b/branch-4.6/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/branch-4.6/_static/img/mascots/scylla-monitor.svg b/branch-4.6/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/branch-4.6/_static/img/mascots/scylla-movement-fast.png b/branch-4.6/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-movement-fast.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-movement.png b/branch-4.6/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-movement.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-onpremise.png b/branch-4.6/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-onpremise.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-opensource.svg b/branch-4.6/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/branch-4.6/_static/img/mascots/scylla-operator.svg b/branch-4.6/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/branch-4.6/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/branch-4.6/_static/img/mascots/scylla-plugin.png b/branch-4.6/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-plugin.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-release-mascot.png b/branch-4.6/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-release-mascot.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-repair.png b/branch-4.6/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-repair.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-server.png b/branch-4.6/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-server.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-sleeping.png b/branch-4.6/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-sleeping.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-tall-measure.png b/branch-4.6/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-tall-measure.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-university.png b/branch-4.6/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-university.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-weights.png b/branch-4.6/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-weights.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-window-cleaning.png b/branch-4.6/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-with-computer-2.png b/branch-4.6/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-with-computer.png b/branch-4.6/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-with-computer.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-with-linux.png b/branch-4.6/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-with-linux.png differ diff --git a/branch-4.6/_static/img/mascots/scylla-writting.png b/branch-4.6/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/branch-4.6/_static/img/mascots/scylla-writting.png differ diff --git a/branch-4.6/_static/img/menu.svg b/branch-4.6/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/branch-4.6/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/branch-4.6/_static/img/scylla-monitor.png b/branch-4.6/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/branch-4.6/_static/img/scylla-monitor.png differ diff --git a/branch-4.6/_static/js/main.bundle.js b/branch-4.6/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/branch-4.6/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                            • Back
                            • ',backButtonPosition:"top",wrapper:"
                              ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                                "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                                ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                                ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                                ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                                ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                                "],col:[2,"","
                                "],tr:[2,"","
                                "],td:[3,"","
                                "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +

                                ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                + + +
                                + + + + + +
                                + + +
                                + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/genindex.html b/branch-4.6/genindex.html new file mode 100644 index 000000000..2eb55b031 --- /dev/null +++ b/branch-4.6/genindex.html @@ -0,0 +1,631 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + + + +
                                + + + + + +
                                + + +
                                + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/index.html b/branch-4.6/index.html new file mode 100644 index 000000000..4263ae7ca --- /dev/null +++ b/branch-4.6/index.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                ScyllaDB Monitoring Stack

                                +
                                +
                                +

                                ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                +_images/monitor.png +

                                The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                                +
                                  +
                                • prometheus - collects and stores metrics

                                • +
                                • alertmanager - handles alerts

                                • +
                                • grafana - dashboard server

                                • +
                                +

                                Choose a topic to get started:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/docker-compose.html b/branch-4.6/install/docker-compose.html new file mode 100644 index 000000000..a74302b81 --- /dev/null +++ b/branch-4.6/install/docker-compose.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Using Docker Compose

                                +

                                Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                                +

                                Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                                +
                                +

                                Warning

                                +

                                docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                                +
                                +
                                +

                                Prerequisite

                                +

                                Make sure you have docker and docker-compose installed.

                                +
                                +
                                +

                                Setting Prometheus

                                +

                                The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                                +

                                You can use ./prometheus-config.sh to generate the file, for example:

                                +
                                ./prometheus-config.sh --compose
                                +
                                +
                                +

                                For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                                +
                                +
                                +

                                Setting Grafana Provisioning

                                +

                                Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                                +
                                +

                                Grafana Data-Source file

                                +

                                Run the following command to update the datasource:

                                +
                                ./grafana-datasource.sh --compose
                                +
                                +
                                +

                                You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                                +
                                +
                                +

                                Grafana Dashboard Load file

                                +

                                To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                                +
                                ./generate-dashboards.sh -t -v 2020.1
                                +
                                +
                                +

                                This command generates the files under: grafana/provisioning/dashboards/

                                +
                                +
                                +
                                +

                                Docker Compose file

                                +

                                You can use the following example as a base for your docker compose.

                                +

                                Pass the following to a file called docker-compose.yml

                                +
                                services:
                                +  alertmanager:
                                +    container_name: aalert
                                +    image: prom/alertmanager:v0.24.0
                                +    ports:
                                +    - 9093:9093
                                +    volumes:
                                +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                                +  grafana:
                                +    container_name: agraf
                                +    environment:
                                +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                                +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                                +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                                +    # This is where you set Grafana security
                                +    - GF_AUTH_BASIC_ENABLED=false
                                +    - GF_AUTH_ANONYMOUS_ENABLED=true
                                +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                                +    - GF_SECURITY_ADMIN_PASSWORD=admin
                                +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                                +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                                +    image: grafana/grafana:9.3.11
                                +    ports:
                                +    - 3000:3000
                                +    user: 1000:1000
                                +    volumes:
                                +    - ./grafana/build:/var/lib/grafana/dashboards
                                +    - ./grafana/plugins:/var/lib/grafana/plugins
                                +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                                +    # Uncomment the following line for grafana persistency
                                +    # - path/to/grafana/dir:/var/lib/grafana
                                +  loki:
                                +    command:
                                +    - --config.file=/mnt/config/loki-config.yaml
                                +    container_name: loki
                                +    image: grafana/loki:2.7.3
                                +    ports:
                                +    - 3100:3100
                                +    volumes:
                                +    - ./loki/rules:/etc/loki/rules
                                +    - ./loki/conf:/mnt/config
                                +  promotheus:
                                +    command:
                                +    - --config.file=/etc/prometheus/prometheus.yml
                                +    container_name: aprom
                                +    image: prom/prometheus:v2.42.0
                                +    ports:
                                +    - 9090:9090
                                +    volumes:
                                +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                                +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                                +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                                +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                                +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                                +    # Uncomment the following line for prometheus persistency 
                                +    # - path/to/data/dir:/prometheus/data
                                +  promtail:
                                +    command:
                                +    - --config.file=/etc/promtail/config.yml
                                +    container_name: promtail
                                +    image: grafana/promtail:2.7.3
                                +    ports:
                                +    - 1514:1514
                                +    - 9080:9080
                                +    volumes:
                                +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                                +version: '3'
                                +
                                +
                                +
                                +

                                Start and Stop

                                +

                                To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/index.html b/branch-4.6/install/index.html new file mode 100644 index 000000000..f8c1064b9 --- /dev/null +++ b/branch-4.6/install/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Download and Install Scylla Monitoring Stack

                                +
                                +
                                +

                                Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                                +

                                Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/min-prod-hw.html b/branch-4.6/install/min-prod-hw.html new file mode 100644 index 000000000..b35652f8c --- /dev/null +++ b/branch-4.6/install/min-prod-hw.html @@ -0,0 +1,730 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Minimal Production System Recommendations

                                +
                                  +
                                • CPU - at least 2 physical cores/ 4vCPUs

                                • +
                                • Memory - 15GB+ DRAM and proportional to the number of cores.

                                • +
                                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                • +
                                • Network - 1GbE/10GbE preferred

                                • +
                                +
                                +

                                Calculating Prometheus Minimal Disk Space requirement

                                +

                                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                +

                                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                +

                                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                +
                                6 * 16 * 15 * 12MB ~ 16GB
                                +
                                +
                                +

                                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                +
                                +
                                +

                                Calculating Prometheus Minimal Memory Space requirement

                                +

                                Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                +

                                For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                + +
                                + +++++++ + + + +
                                # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                00
                                + +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/monitor-without-docker.html b/branch-4.6/install/monitor-without-docker.html new file mode 100644 index 000000000..b93318d04 --- /dev/null +++ b/branch-4.6/install/monitor-without-docker.html @@ -0,0 +1,1146 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Deploying Scylla Monitoring Stack Without Docker

                                +
                                +

                                Introduction

                                +

                                The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                                +

                                Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                                +

                                Scylla Monitoring uses the following components:

                                +
                                  +
                                • Alertmanager

                                • +
                                • Grafana Loki

                                • +
                                • Prometheus

                                • +
                                • Grafana

                                • +
                                +

                                The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components.

                                +

                                We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                                +
                                +
                                +

                                Minimal Production System Recommendations

                                +
                                  +
                                • CPU - at least 2 physical cores/ 4vCPUs

                                • +
                                • Memory - 15GB+ DRAM and proportional to the number of cores.

                                • +
                                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                • +
                                • Network - 1GbE/10GbE preferred

                                • +
                                +
                                +

                                Calculating Prometheus Minimal Disk Space requirement

                                +

                                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                +

                                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                +

                                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                +
                                6 * 16 * 15 * 12MB ~ 16GB
                                +
                                +
                                +

                                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                +
                                +
                                +

                                Calculating Prometheus Minimal Memory Space requirement

                                +

                                Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                +

                                For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                + +
                                + +++++++ + + + +
                                # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                00
                                + +
                                +

                                The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                                +
                                +

                                Note

                                +

                                Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                                +
                                +
                                +
                                +
                                +

                                Install Scylla Monitoring Stack

                                +

                                The following procedure uses a CentOS 7 based instance

                                +
                                  +
                                1. Download the latest Scylla Monitoring Stack release.

                                2. +
                                +
                                wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.6.0.tar.gz
                                +
                                +
                                +
                                  +
                                1. Open the tar

                                2. +
                                +

                                tar -xvf scylla-monitoring-*.tar.gz

                                +
                                +
                                +

                                Install Alertmanager

                                +

                                Tested with alertmanager 0.22.2 version

                                +
                                  +
                                1. Install alertmanager

                                2. +
                                +
                                wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                                +tar -xvf alertmanager-*.linux-amd64.tar.gz
                                +
                                +
                                +
                                  +
                                1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                                2. +
                                +

                                For example:

                                +
                                cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.6.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                                +
                                +
                                +
                                  +
                                1. Start the Alertmanager

                                2. +
                                +

                                For example:

                                +
                                cd alertmanager-0.22.2.linux-amd64
                                +./alertmanager
                                +
                                +
                                +
                                  +
                                1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                                2. +
                                +

                                For example:

                                +
                                http://192.168.135.166:9093/
                                +
                                +
                                +../_images/alertmanager.png +
                                +
                                +

                                Install Grafana Loki

                                +

                                Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                                +

                                We recomand using Loki with containers, but you can install it locally as described in Loki installation

                                +

                                You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                                +

                                Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                                +

                                Loki Related files

                                +

                                Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                                +
                                mkdir -p /etc/loki/rules
                                +mkdir -p /etc/loki/config
                                +cp loki/rules/* /etc/loki/rules
                                +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                                +
                                +
                                +

                                Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                                +

                                Promtail Related files

                                +

                                Promtail has a configuration file. You need to copy and modify the configuration.

                                +
                                mkdir -p /etc/promtail/
                                +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                                +
                                +
                                +

                                Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                                +
                                +
                                +

                                Install Prometheus

                                +

                                Tested with Prometheus version 2.27.1

                                +
                                +

                                Note

                                +

                                If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                                +
                                +
                                  +
                                1. Install Prometheus

                                2. +
                                +
                                wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                                +tar -xvf prometheus-*.linux-amd64.tar.gz
                                +
                                +
                                +

                                2. Create Data and Config directories +.. code-block:: shell

                                +
                                +

                                mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                                +
                                +
                                  +
                                1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                                2. +
                                +

                                Copy prometheus/prometheus.yml.template to prometheus.yml

                                +

                                For example:

                                +
                                cp scylla-monitoring-scylla-monitoring-4.6.0/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                                +cp scylla-monitoring-scylla-monitoring-4.6.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                                +
                                +
                                +
                                  +
                                1. Edit the prometheus.yml file to point to the correct static data sources.

                                2. +
                                +
                                +

                                Note

                                +

                                Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                                +
                                +
                                vi /etc/prometheus/prometheus.yml
                                +
                                +
                                +

                                Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                                +

                                For example if the alertmanager will run on the same host:

                                +
                                alerting:
                                +   alertmanagers:
                                +   - static_configs:
                                +       - targets:
                                +           - 127.0.0.1:9093
                                +
                                +
                                +

                                Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                                +

                                For example the scrape config for Scylla:

                                +
                                global:
                                +  scrape_interval: 5s # By default, scrape targets every 5 second.
                                +  scrape_timeout: 4s # Timeout before trying to scape a target again
                                +
                                +  # Attach these labels to any time series or alerts when communicating with
                                +  # external systems (federation, remote storage, Alertmanager).
                                +  external_labels:
                                +    monitor: 'scylla-monitor'
                                +
                                +scrape_configs:
                                +- job_name: scylla
                                +  honor_labels: false
                                +  file_sd_configs:
                                +    - files:
                                +      - /etc/scylla.d/prometheus/scylla_servers.yml
                                +  relabel_configs:
                                +    - source_labels: [__address__]
                                +      regex:  '([^:]+)'
                                +      target_label: __address__
                                +      replacement: '${1}:9180'
                                +
                                +    - source_labels: [__address__]
                                +      regex:  '(.*):.+'
                                +      target_label: instance
                                +      replacement: '${1}'
                                +
                                +
                                +
                                  +
                                1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                                2. +
                                +
                                +

                                Note

                                +

                                There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                                +
                                +

                                An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                                +
                                +

                                Note

                                +

                                You must have both files even if you are not using Scylla Manager

                                +
                                +

                                Add the labels for the cluster and data-center

                                +

                                scylla_servers.yml:

                                +

                                For example:

                                +
                                cat scylla_servers.yml
                                +# List Scylla end points
                                +
                                +- targets:
                                +  - 192.168.66.6
                                +  - 192.168.66.244
                                +  labels:
                                +    cluster: cluster1
                                +    dc: dc1
                                +- targets:
                                +    - 172.17.0.3
                                +  labels:
                                +    cluster: cluster1
                                +    dc: dc2
                                +
                                +
                                +
                                +

                                Note

                                +

                                See the previous note about deprecating the node_exporter_servers.yml file.

                                +
                                +

                                scylla_manager_server.yml

                                +

                                For example:

                                +
                                - targets:
                                +  - 127.0.0.1:5090
                                +
                                +
                                +
                                  +
                                1. Start Prometheus server:

                                2. +
                                +

                                For example:

                                +
                                cd scylla-monitoring-scylla-monitoring-4.6.0/
                                +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                                +
                                +
                                +

                                Data should start accumulate on: /prometheus/data

                                +
                                  +
                                1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                                2. +
                                +

                                For example:

                                +
                                http://192.168.135.166:9090/
                                +
                                +
                                +../_images/1.png +

                                Prometheus console should be visible

                                +
                                  +
                                1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                                2. +
                                +

                                For example:

                                +

                                node_memory_MemFree

                                +../_images/2.png +

                                And

                                +

                                scylla_reactor_utilization

                                +../_images/3.png +

                                At this point Scylla is emitting the metrics and Prometheus is able to store them.

                                +
                                +
                                +

                                Install Grafana

                                +

                                Tested with Grafna 7.5.7

                                +
                                  +
                                1. Install Grafana based on the instructions here

                                2. +
                                +

                                Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                                +
                                  +
                                1. Access Scylla-Grafana-monitoring directory

                                2. +
                                +
                                cd scylla-monitoring-scylla-monitoring-4.6.0/
                                +
                                +
                                +
                                  +
                                1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                                2. +
                                +
                                sudo cp -r grafana/plugins /var/lib/grafana/
                                +
                                +
                                +

                                If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                                +

                                For example:

                                +
                                cp -r grafana/plugins ../grafana-7.5.7/public/app
                                +
                                +
                                +
                                  +
                                1. Provision the Dashboards

                                2. +
                                +

                                For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                                +

                                For Grafana installed with yum install

                                +
                                sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                                +sudo mkdir -p /var/lib/grafana/dashboards
                                +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                                +
                                +
                                +

                                For Grafana installed from packages

                                +
                                cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                                +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                                +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                                +
                                +
                                +

                                Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                                +
                                +

                                Note

                                +

                                A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                                +
                                +
                                  +
                                1. Set the data source by copy datasource.yml and edit it

                                2. +
                                +
                                sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                                +
                                +
                                +
                                +

                                Note

                                +

                                Scylla uses a plugin to read from some system tables see the section below about using it.

                                +
                                +

                                For Grafana installed from packages

                                +
                                cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                                +
                                +
                                +

                                You should set the Prometheus and the alertmanager IP and port.

                                +

                                For example

                                +
                                sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                                +apiVersion: 1
                                +datasources:
                                + - name: prometheus
                                +   type: prometheus
                                +   url: http://192.168.135.167:9090
                                +   access: proxy
                                +   basicAuth: false
                                +
                                + - name: alertmanager
                                +   type: camptocamp-prometheus-alertmanager-datasource
                                +   orgId: 1
                                +   typeLogoUrl: public/img/icn-datasource.svg
                                +   access: proxy
                                +   url: http://192.168.135.166:9093
                                +   password:
                                +   user:
                                +   database:
                                +   basicAuth:
                                +   isDefault:
                                +   jsonData:
                                +     severity_critical: '4'
                                +     severity_high: '3'
                                +     severity_warning: '2'
                                +     severity_info: '1'
                                +
                                +
                                +
                                  +
                                1. Start the Grafana service

                                2. +
                                +

                                For Grafana installed with yum install

                                +

                                sudo service grafana-server start

                                +

                                For Grafana installed from packages:

                                +

                                cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                                +

                                Edit scylla.ini to reflect the right paths in the paths section of the file.

                                +
                                plugins = /home/centos/grafana-7.5.7/data/plugins
                                +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                                +
                                +
                                +

                                Start the server:

                                +
                                cd /home/centos/grafana-7.5.7/
                                +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                                +
                                +
                                +
                                  +
                                1. Make sure Grafana is running

                                2. +
                                +

                                Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                                +../_images/grafana.png +
                                +
                                +

                                Using Scylla Plugin with Grafana

                                +

                                Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                                +

                                Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                                +
                                +

                                Setting a monitoring user

                                +

                                This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                                +
                                  +
                                • If you have not done so, enable authorization first.

                                • +
                                • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                                • +
                                • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                                • +
                                +
                                +
                                +

                                Installing the Plugin

                                +

                                Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                                +
                                +
                                +

                                Configure the Plugin

                                +

                                Add an entry to the datasource.yml file

                                +
                                - name: scylla-datasource
                                +  type: scylladb-scylla-datasource
                                +  orgId: 1
                                +  isDefault:
                                +  jsonData:
                                +  host: ''
                                +#  secureJsonData:
                                +#    user: 'scylla_monitoring'
                                +#    password: 'scylla_monitoring'
                                +
                                +
                                +

                                As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                                +
                                +
                                +

                                Enable the Plugin

                                +

                                Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                                +

                                See more about it the Grafana configuration.

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/monitoring-stack.html b/branch-4.6/install/monitoring-stack.html new file mode 100644 index 000000000..ac9507d79 --- /dev/null +++ b/branch-4.6/install/monitoring-stack.html @@ -0,0 +1,1093 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Install Scylla Monitoring Stack

                                +

                                This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                                +

                                The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                                +

                                For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                                +
                                +

                                Minimal Production System Recommendations

                                +
                                  +
                                • CPU - at least 2 physical cores/ 4vCPUs

                                • +
                                • Memory - 15GB+ DRAM and proportional to the number of cores.

                                • +
                                • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                • +
                                • Network - 1GbE/10GbE preferred

                                • +
                                +
                                +

                                Calculating Prometheus Minimal Disk Space requirement

                                +

                                Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                +

                                Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                +

                                For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                +
                                6 * 16 * 15 * 12MB ~ 16GB
                                +
                                +
                                +

                                To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                +
                                +
                                +

                                Calculating Prometheus Minimal Memory Space requirement

                                +

                                Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                +

                                For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                + +
                                + +++++++ + + + +
                                # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                00
                                + +
                                +
                                +
                                +
                                +

                                Prerequisites

                                +
                                  +
                                • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                                • +
                                • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                                • +
                                + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                Scylla Monitoring Stack Compatibility Matrix

                                Scylla Monitoring Stack Version

                                Prometheus Version

                                Grafana Version

                                4.6

                                2.48.1

                                10.2.2

                                4.5

                                2.47.1

                                10.1.5

                                4.4

                                2.44.0

                                9.5.2

                                4.3

                                2.42.0

                                9.3.8

                                4.2

                                2.41.0

                                9.3.4

                                4.1

                                2.38.0

                                9.1.0

                                4.0

                                2.34.0

                                8.5.2

                                3.11

                                2.32.0

                                8.3.4

                                3.10

                                2.32.0

                                8.3.3

                                3.9.2

                                2.29.1

                                8.2.7

                                3.9

                                2.29.1

                                8.1.1

                                3.8

                                2.27.1

                                7.5.7

                                3.7

                                2.25.2

                                7.4.0

                                3.6

                                2.18.1

                                7.3.5

                                3.5

                                2.18.1

                                7.1.5

                                3.4

                                2.18.1

                                6.7.3

                                +
                                +
                                +

                                Docker Post Installation

                                +

                                Docker post installation guide can be found here

                                +
                                +

                                Note

                                +

                                Avoid running the container as root.

                                +
                                +

                                To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                                +
                                  +
                                1. Create the Docker group.

                                2. +
                                +
                                sudo groupadd docker
                                +
                                +
                                +
                                  +
                                1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                                2. +
                                +
                                sudo usermod -aG docker $USER
                                +
                                +
                                +
                                  +
                                1. Start Docker by calling:

                                2. +
                                +
                                sudo systemctl enable docker
                                +
                                +
                                +
                                +
                                +

                                Install Scylla Monitoring Stack

                                +

                                Procedure

                                +
                                  +
                                1. Download and extract the latest Scylla Monitoring Stack binary;.

                                2. +
                                +
                                wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.6.0.tar.gz
                                +tar -xvf scylla-monitoring-4.6.0.tar.gz
                                +cd scylla-monitoring-scylla-monitoring-4.6.0
                                +
                                +
                                +

                                As an alternative, you can clone and use the Git repository directly.

                                +
                                git clone https://github.com/scylladb/scylla-monitoring.git
                                +cd scylla-monitoring
                                +git checkout branch-4.6
                                +
                                +
                                +
                                  +
                                1. Start Docker service if needed

                                2. +
                                +
                                sudo systemctl restart docker
                                +
                                +
                                +
                                +
                                +

                                Configure Scylla Monitoring Stack

                                +

                                To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                                +

                                This configuration can be done from files, or using the Consul api.

                                +

                                Scylla Manager 2.0 and higher supports the Consul API.

                                +
                                +

                                Configure Scylla nodes from files

                                +
                                  +
                                1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                                2. +
                                +
                                +

                                Note

                                +

                                It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                                +
                                +

                                For example:

                                +
                                - targets:
                                +      - 172.17.0.2
                                +      - 172.17.0.3
                                +  labels:
                                +      cluster: cluster1
                                +      dc: dc1
                                +
                                +
                                +
                                +

                                Note

                                +

                                If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                                +
                                +

                                Using IPV6

                                +

                                To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets.

                                +

                                For example:

                                +
                                - targets:
                                +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]"
                                +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]"
                                +  labels:
                                +      cluster: cluster1
                                +      dc: dc1
                                +
                                +
                                +
                                +

                                Note

                                +

                                For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                                +
                                +

                                For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                                +
                                +

                                Note

                                +

                                By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                                +
                                +

                                If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                                +

                                For example:

                                +
                                ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                                +
                                +
                                +

                                Mark the different Data Centers with Labels.

                                +

                                As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                                +

                                You can use the genconfig.py script to generate the server file. For example:

                                +
                                ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                                +
                                +
                                +

                                This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                                +

                                OR

                                +

                                The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                                +
                                nodetool status | ./genconfig.py -NS
                                +
                                +
                                +

                                2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                                +

                                You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                                +

                                For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                                +
                                # List Scylla Manager end points
                                +
                                +- targets:
                                +  - 172.17.0.7:5090
                                +
                                +
                                +

                                Note that you do not need to add labels to the Scylla Manager targets.

                                +
                                +
                                +

                                Configure Scylla nodes using Scylla-Manager Consul API

                                +

                                Scylla Manager 2.0 has a Consul like API.

                                +

                                When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                                +

                                For example:

                                +
                                ./start-all.sh -L 10.10.0.1
                                +
                                +
                                +
                                +

                                Note

                                +

                                If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                                +
                                +
                                +
                                +

                                Connecting Scylla-Monitoring to ScyllaDB

                                +

                                Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                                +

                                You can limit the user to read only, currently it only read table from the system keyspace.

                                +

                                You can set a user and password from a file or environment variables.

                                +

                                If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                                +

                                To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                                +
                                +

                                Note

                                +

                                It is best to use a dedicated user and password with limited privileges.

                                +
                                +
                                +
                                +

                                Use an external directory for the Prometheus data directory

                                +

                                The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                                +
                                +

                                Note

                                +

                                Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                                +
                                +

                                If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                                +

                                In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                                +
                                +
                                +

                                Add Additional Prometheus Targets

                                +

                                There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                                +

                                The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                                +

                                You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                                +
                                - job_name: 'myservice'
                                +  # Override the global default and scrape targets from this job every 5 seconds.
                                +  scrape_interval: 5s
                                +  static_configs:
                                +    - targets:
                                +      - 17.0.0.1:7000
                                +
                                +
                                +
                                +
                                +
                                +

                                Start and Stop Scylla Monitoring Stack

                                +
                                +

                                Start

                                +
                                ./start-all.sh -d prometheus_data
                                +
                                +
                                +
                                +
                                +

                                Stop

                                +
                                ./kill-all.sh
                                +
                                +
                                +
                                +
                                +

                                Start a Specific Scylla Monitoring Stack Version

                                +

                                By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                                +

                                You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                                +

                                Multiple versions are supported. For example:

                                +
                                ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                                +
                                +
                                +

                                will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                                +
                                +
                                +

                                Accessing the localhost

                                +

                                The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                                +
                                ./start-all.sh -l -d prometheus-data
                                +
                                +
                                +
                                +
                                +

                                Configure rsyslog on each Scylla node

                                +

                                generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                                +

                                Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                                +

                                Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                                +

                                If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                                +
                                if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                                +
                                +
                                +

                                Restart rsyslog for the configuration to take effect.

                                +
                                systemctl restart rsyslog
                                +
                                +
                                +
                                +
                                +
                                +

                                View Grafana Dashboards

                                +

                                Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/start-all.html b/branch-4.6/install/start-all.html new file mode 100644 index 000000000..936a9ee67 --- /dev/null +++ b/branch-4.6/install/start-all.html @@ -0,0 +1,745 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                The start-all.sh Command

                                +

                                Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                                +

                                The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                                +
                                +

                                General Options

                                +

                                -h Help, Print the help, and exit.

                                +

                                –version print the current Scylla-Monitoring stack version, and exit.

                                +

                                -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                                +

                                -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                                +

                                -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                                +

                                –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                                +

                                –compose This is an experimental option. When set, it initiates a two-stage process. Firstly, a docker-compose.yml file is created along with an .env file. Following this, the script executes docker-compose up. Please note that having docker-compose is a prerequisite.

                                +
                                + + +
                                +

                                Alert Manager

                                +

                                The Alertmanager handles the alerts and takes the following parameters:

                                +

                                -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                                +

                                -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                                +

                                -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/install/thanos.html b/branch-4.6/install/thanos.html new file mode 100644 index 000000000..30f68a97b --- /dev/null +++ b/branch-4.6/install/thanos.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Using Thanos as Data Source With Scylla Monitoring Stack

                                +

                                Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                                +
                                  +
                                • High-availability.

                                • +
                                • Horizontal scaling.

                                • +
                                • Backup.

                                • +
                                +

                                The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                                +

                                The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                                +
                                +

                                Using Thanos As a Prometheus Aggregator

                                +

                                There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                                +
                                +

                                Prometheus Configuration

                                +

                                We will assume you have two Prometheus servers running.

                                +
                                  +
                                1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                                2. +
                                3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                                4. +
                                +
                                +
                                +

                                Thanos sidecar

                                +

                                The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                                +
                                docker run -d \
                                + -v /path/to/prom/dir:/data/prom:z \
                                + -i --name sidecar thanosio/thanos \
                                + sidecar \
                                + --grpc-address=0.0.0.0:10911 \
                                + --grpc-grace-period=1s \
                                + --http-address=0.0.0.0:10912 \
                                + --http-grace-period=1s \
                                + --prometheus.url=http://prometheus-ip:9090 \
                                + --tsdb.path=/data/prom \
                                + -p 10912:10912 \
                                + -p 10911:10911
                                +
                                +
                                +

                                After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                                +
                                +
                                +

                                Thanos query

                                +

                                Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                                +
                                docker run -d \
                                + --name thanos -- thanosio/thanos \
                                +   query \
                                +   --debug.name=query0 \
                                +   --log.level=debug \
                                +   --grpc-address=0.0.0.0:10903 \
                                +   --grpc-grace-period=1s \
                                +   --http-address=0.0.0.0:10904 \
                                +   --http-grace-period=1s \
                                +   --query.replica-label=prometheus \
                                +   --store={ip1}:10911 --store={ip2}:10911
                                +
                                +
                                +

                                After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                                +
                                +
                                +

                                Update Scylla Data source

                                +

                                The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                                +

                                The file you edit is a template file that replaces the file Grafana uses, next time you start.

                                +

                                Restart the Scylla Monitoring Stack it should now use Thanos.

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/intro.html b/branch-4.6/intro.html new file mode 100644 index 000000000..7afdcda30 --- /dev/null +++ b/branch-4.6/intro.html @@ -0,0 +1,693 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                ScyllaDB Monitoring Stack

                                +

                                ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                +_images/monitor.png +

                                The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                                +
                                  +
                                • prometheus - Collects and stores metrics

                                • +
                                • grafan-loki - Parses logs and generates metrics and alerts

                                • +
                                • alertmanager - Handles alerts

                                • +
                                • grafana - Dashboards server

                                • +
                                +

                                A few optional components are used for additional services

                                +
                                  +
                                • grafana-image-renderer - Allows you to download a dashboard as an image.

                                • +
                                • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                                • +
                                +
                                +

                                High Level Architecture

                                +_images/monitoring_stack1.png +

                                We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                                +

                                We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                                +

                                The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                                +

                                We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                                +

                                Choose a topic to get started:

                                + +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/objects.inv b/branch-4.6/objects.inv new file mode 100644 index 000000000..7f8272894 Binary files /dev/null and b/branch-4.6/objects.inv differ diff --git a/branch-4.6/procedures/alerts/alerting.html b/branch-4.6/procedures/alerts/alerting.html new file mode 100644 index 000000000..74ba8ba19 --- /dev/null +++ b/branch-4.6/procedures/alerts/alerting.html @@ -0,0 +1,762 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Alerting

                                +

                                Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                                +

                                You can read more about Prometheus alerting here

                                +

                                By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                                +

                                In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                                +

                                The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                                +../../_images/monitoring_stack.png +
                                +

                                Prometheus Alerts

                                +

                                The Prometheus alerts are defined in files placed under prometheus/prom_rules/. Prometheus will load any file that ends with yml or yaml.

                                +

                                Each Prometheus alert consists of:

                                +
                                  +
                                • Name

                                • +
                                • What happened

                                • +
                                • For how long

                                • +
                                • What to report

                                • +
                                +

                                For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                                +
                                - alert: InstanceDown
                                +  expr: up == 0
                                +  for: 60s
                                +  labels:
                                +    severity: "error"
                                +  annotations:
                                +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                                +    summary: Instance {{ $labels.instance }} down
                                +
                                +
                                +

                                The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                                +

                                The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                                +

                                The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to error.

                                +

                                annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                                +
                                +

                                Alerts severity

                                +

                                Prometheus uses the following severities from low to high: info, warn, error, critical.

                                +

                                The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the error alert for disk-full is firing, it silences the warn alert.

                                +

                                When adding your own alerts, you can use the severities to signal the action’s importance, for example critical would be a pager-duty, while an error will be an email.

                                +
                                +
                                +

                                Adding Alerts

                                +

                                Add your own alerts in a separate file with a yml or yaml extension. Making it easier during upgrade.

                                +
                                +
                                +

                                Modifying Alerts

                                +

                                It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade.

                                +
                                +
                                +
                                +

                                Alertmanager

                                +

                                The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                                +

                                The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                                +
                                  +
                                • Routes: Represent a routing tree, the most specific rule, wins

                                • +
                                • Inhibition: Mute an alert, based on another alert

                                • +
                                • Receiver: Send a notification via email, sluck, etc’

                                • +
                                +

                                Check the Alertmanager documentation for details on how to specify a specific receiver.

                                +

                                In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                                +
                                +
                                +

                                Tips When Adding an Alert

                                +

                                It’s worse having an alert that does not work, than not having an alert at all

                                +

                                There are multiple ways you can use to make sure your alert is set correctly:

                                +
                                  +
                                • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                                • +
                                • Force the alert to be active by reducing the limits or the duration.

                                • +
                                • When possible simulate the actual scenario and see that the alert works as expected.

                                • +
                                +

                                For example, low available disk space.

                                +

                                Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                                +

                                Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                                +

                                Starting with a simple working expression helps you bisect problems.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/procedures/alerts/index.html b/branch-4.6/procedures/alerts/index.html new file mode 100644 index 000000000..f03e08c52 --- /dev/null +++ b/branch-4.6/procedures/alerts/index.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Alert Manager

                                +
                                +
                                +

                                Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/procedures/datadog/index.html b/branch-4.6/procedures/datadog/index.html new file mode 100644 index 000000000..12b57cdcf --- /dev/null +++ b/branch-4.6/procedures/datadog/index.html @@ -0,0 +1,737 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Datadog Integration

                                +

                                The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                                +
                                  +
                                1. Installing and configuring the Datadog Agent.

                                2. +
                                3. Add Datadog recording rules.

                                4. +
                                5. Loading Scylla dashboard to Datadog.

                                6. +
                                7. Optionally load Monitor (Alerts).

                                8. +
                                +
                                +

                                Note

                                +

                                Scylla Cloud users, use and update the proper configuration file.

                                +
                                +
                                +

                                Install And configure the Datadog Agent

                                +

                                Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                                +

                                Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                +
                                +

                                Scylla Cloud Users

                                +

                                Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                +

                                Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                                +
                                +
                                +

                                Other Scylla Users

                                +

                                Other Scylla users, download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                                +
                                +
                                +

                                Post configuration

                                +

                                Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                                +
                                +

                                Note

                                +

                                By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                +
                                +
                                +
                                +
                                +

                                Add datadog recording rules

                                +

                                Non Scylla Cloud users, download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                                +

                                Cloud users, skip this step, it’s been take care for by the cloud.

                                +
                                +
                                +

                                Upload the Dashboard

                                +

                                Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                +
                                +
                                +

                                Using the Dashboard

                                +

                                We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                                +../../_images/datadog.png +

                                The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                +
                                +

                                Note

                                +

                                Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                +
                                +
                                +
                                +

                                Adding Monitor

                                +

                                Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/procedures/index.html b/branch-4.6/procedures/index.html new file mode 100644 index 000000000..a21298b98 --- /dev/null +++ b/branch-4.6/procedures/index.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                ScyllaDB Monitoring Stack Procedures

                                +
                                +
                                +

                                There are several reference guides available which give additional information. Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/procedures/updating-dashboard.html b/branch-4.6/procedures/updating-dashboard.html new file mode 100644 index 000000000..1d252b8e4 --- /dev/null +++ b/branch-4.6/procedures/updating-dashboard.html @@ -0,0 +1,949 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Adding and Modifying Dashboards

                                +

                                This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                                +

                                It covers dashboard templates and how to modify them.

                                + +
                                +

                                General Limitations

                                +

                                Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                                +
                                +

                                Consistency Between Restarts

                                +

                                By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                                +
                                +
                                +

                                Consistency Between Upgrades

                                +

                                As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                                +
                                +

                                Note

                                +

                                 You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                                +
                                +

                                At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                                +
                                +
                                +
                                +

                                Using Templated Dashboards

                                +

                                Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                                +

                                Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                                +

                                For example a typical graph panel would look like this:

                                +
                                {
                                +    "aliasColors": {},
                                +    "bars": false,
                                +    "datasource": "prometheus",
                                +    "editable": true,
                                +    "error": false,
                                +    "fill": 0,
                                +    "grid": {
                                +        "threshold1": null,
                                +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                                +        "threshold2": null,
                                +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                                +    },
                                +    "gridPos": {
                                +        "h": 6,
                                +        "w": 10,
                                +        "x": 0,
                                +        "y": 4
                                +    },
                                +    "id": 2,
                                +    "isNew": true,
                                +    "legend": {
                                +        "avg": false,
                                +        "current": false,
                                +        "max": false,
                                +        "min": false,
                                +        "show": false,
                                +        "total": false,
                                +        "values": false
                                +    },
                                +    "lines": true,
                                +    "linewidth": 2,
                                +    "links": [],
                                +    "nullPointMode": "connected",
                                +    "percentage": false,
                                +    "pointradius": 5,
                                +    "points": false,
                                +    "renderer": "flot",
                                +    "seriesOverrides": [
                                +        {}
                                +    ],
                                +    "span": 5,
                                +    "stack": false,
                                +    "steppedLine": false,
                                +    "targets": [
                                +        {
                                +            "expr": "sum(node_filesystem_avail) by (instance)",
                                +            "intervalFactor": 1,
                                +            "legendFormat": "",
                                +            "refId": "A",
                                +            "step": 1
                                +        }
                                +    ],
                                +    "timeFrom": null,
                                +    "timeShift": null,
                                +    "title": "Available Disk Size",
                                +    "tooltip": {
                                +        "msResolution": false,
                                +        "shared": true,
                                +        "sort": 0,
                                +        "value_type": "cumulative"
                                +    },
                                +    "transparent": false,
                                +    "type": "graph",
                                +    "xaxis": {
                                +        "show": true
                                +    },
                                +    "yaxes": [
                                +        {
                                +            "format": "percent",
                                +            "logBase": 1,
                                +            "max": 101,
                                +            "min": 0,
                                +            "show": true
                                +        },
                                +        {
                                +            "format": "short",
                                +            "logBase": 1,
                                +            "max": null,
                                +            "min": null,
                                +            "show": true
                                +        }
                                +    ]
                                +}
                                +
                                +
                                +

                                As you can imagine, most panels would have similar values.

                                +

                                To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                                +
                                +

                                The Template Class System

                                +

                                The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                                +

                                The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                                +

                                In the template file, you can also add or override attributes.

                                +

                                The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                                +

                                When generating dashboards, each class will be replaced by its definition.

                                +

                                For example, a row in the type.json is defined as:

                                +
                                {
                                + "base_row": {
                                +     "collapse": false,
                                +     "editable": true
                                + },
                                + "row": {
                                +     "class": "base_row",
                                +     "height": "250px"
                                + }
                                + }
                                +
                                +
                                +

                                Will be used like in a template:

                                +
                                {
                                +     "class": "row",
                                +     "height": "150px",
                                +     "panels": [
                                +     ]
                                +}
                                +
                                +
                                +

                                And the output will be:

                                +
                                {
                                +     "class": "row",
                                +     "collapse": false,
                                +     "editable": true,
                                +     "height": "150px",
                                +     "panels": [
                                +
                                +     ]
                                +}
                                +
                                +
                                +

                                We can see that the template added the panels attribute and that it overrides the height attribute.

                                +
                                +
                                +

                                Panel Example

                                +

                                Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                                +
                                {
                                +     "class": "row",
                                +     "panels": [
                                +         {
                                +             "class": "bytes_panel",
                                +             "span": 3,
                                +             "targets": [
                                +                 {
                                +                     "expr": "sum(node_filesystem_avail) by (instance)",
                                +                     "intervalFactor": 1,
                                +                     "legendFormat": "",
                                +                     "metric": "",
                                +                     "refId": "A",
                                +                     "step": 1
                                +                 }
                                +             ],
                                +             "title": "Available Disk Size"
                                +         }
                                +     ]
                                +}
                                +
                                +
                                +

                                In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                                +

                                You can also see that the span attribute is overridden to set the panel size.

                                +

                                To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                                +
                                +
                                +

                                Grafana Formats and Layouts

                                +

                                The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                                +

                                Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                                +

                                The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                                +

                                To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                                +

                                The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                                +

                                You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                                +

                                gridPos has the following attributes:

                                +
                                {
                                +   "x": 0,
                                +   "y": 0,
                                +   "w": 24,
                                +   "h": 4
                                + }
                                +
                                +
                                +

                                When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                                +
                                {
                                +   "gridPos": {
                                +      "h": 2
                                +    }
                                +}
                                +
                                +
                                +
                                +
                                +

                                Generating the dashboards from templates (generate-dashboards.sh)

                                +
                                +

                                Prerequisite

                                +

                                Python 2.7

                                +

                                make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                                +

                                Use the -h flag to get help information.

                                +

                                You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                                +

                                When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                                +

                                For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                                +

                                .\generate-dashboards.sh -v 2020.1

                                +
                                +

                                Note

                                +

                                generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                                +
                                +
                                +
                                +
                                +

                                Validation

                                +

                                After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                                +

                                Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/reference/index.html b/branch-4.6/reference/index.html new file mode 100644 index 000000000..0db6d7c8e --- /dev/null +++ b/branch-4.6/reference/index.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Reference Guide

                                +
                                +
                                +

                                There are several reference guides available which give additional information. Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/reference/matrix.html b/branch-4.6/reference/matrix.html new file mode 100644 index 000000000..4113e938f --- /dev/null +++ b/branch-4.6/reference/matrix.html @@ -0,0 +1,845 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Support Matrix

                                +

                                The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                                + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                                Scylla Monitoring Stack Version

                                Scylla Open Source Version

                                Scylla Enterprise Version

                                Node_exporter[1] Version

                                Scylla Manager Version

                                4.6

                                5.2, 5.4

                                2021.1, 2022.1, 2022.2, 2023.1, 2024.1

                                1.4.1

                                3.0, 3.1, 3.2

                                4.5

                                5.0,5.1,5.2,5.4

                                2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                1.4.1

                                3.0, 3.1, 3.2

                                4.4.5

                                5.0,5.1,5.2,5.4

                                2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                1.4.1

                                3.0, 3.1, 3.2

                                4.4

                                5.0,5.1,5.2

                                2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                1.4.1

                                3.0, 3.1

                                4.3

                                5.0,5.1,5.2

                                2020.1, 2021.1, 2022.1, 2022.2

                                1.4.1

                                2.5, 2.6, 3.0

                                4.2

                                4.5,4.6,5.0,5.1

                                2020.1, 2021.1, 2022.1, 2022.2

                                1.4.1

                                2.5, 2.6, 3.0

                                4.1

                                4.5,4.6,5.0,5.1

                                2020.1, 2021.1, 2022.1, 2022.2

                                0.17

                                2.5, 2.6, 3.0

                                4.0

                                4.3, 4.4, 4.5, 4.6, 5.0

                                2020.1, 2021.1, 2022.1

                                0.17

                                2.3, 2.4, 2.5, 2.6, 3.0

                                3.11

                                4.3, 4.4, 4.5, 4.6, 5.0

                                2020.1, 2021.1, 2022.2

                                0.17

                                2.3, 2.4, 2.5, 2.6

                                3.10

                                4.3, 4.4, 4.5, 4.6

                                2020.1, 2021.1

                                0.17

                                2.3, 2.4, 2.5, 2.6

                                3.9

                                4.3, 4.4, 4.5, 4.6

                                2020.1, 2021.1

                                0.17

                                2.3, 2.4, 2.5

                                3.8

                                4.3, 4.4, 4.5

                                2020.1, 2021.1

                                0.17

                                2.3, 2.4, 2.5

                                3.7

                                4.2, 4.3, 4.4

                                2019.1, 2020.1, 2021.1

                                0.17

                                2.2, 2.3

                                3.6.3

                                4.2, 4.3, 4.4

                                2019.1, 2020.1, 2021.1

                                0.17

                                2.2, 2.3, 2.1

                                3.6

                                4.1, 4.2, 4.3

                                2019.1, 2020.1

                                0.17

                                2.1, 2.2, 2.3

                                3.6.1

                                4.1, 4.2, 4.3

                                2019.1, 2020.1

                                0.17

                                2.1, 2.2

                                3.6.1

                                4.1, 4.2, 4.3, 4.4

                                2019.1, 2020.1

                                0.17

                                2.1, 2.2

                                3.5

                                3.3, 4.0, 4.1, 4.2

                                2019.1, 2020.1

                                0.17

                                2.0, 2.1, 2.2

                                3.4.3

                                3.3, 4.0, 4.1, 4.2

                                2019.1, 2020.1

                                0.17

                                2.0, 2.1

                                3.4

                                3.3, 4.0, 4.1

                                2018.1, 2019.1

                                0.17

                                2.0, 2.1

                                3.3

                                3.1, 3.2, 3.3, 4.0

                                2018.1, 2019.1

                                0.17

                                1.4, 2.0, 2.1

                                3.2

                                3.1, 3.2, 3.3

                                2018.1, 2019.1

                                0.17

                                1.4, 2.0

                                3.1

                                2.3, 3.0, 3.1, 3.2

                                2018.1, 2019.1

                                0.17

                                1.3, 1.4, 2.0

                                3.0

                                2.3, 3.0, 3.1, 3.2

                                2018.1, 2019.1

                                0.17

                                1.3, 1.4

                                2.4

                                2.3, 3.0, 3.1

                                2018.1, 2019.1

                                0.14, 0.17

                                1.3, 1.4

                                2.3

                                2.3, 3.0

                                2018.1, 2019.1

                                0.14, 0.17

                                1.3

                                2.2

                                2.3, 3.0

                                2018.1, 2019.1

                                0.14, 0.17

                                1.3

                                2.1

                                2.3, 3.0

                                2018.1

                                0.14, 0.17

                                1.3

                                +

                                [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/reference/monitoring-apis.html b/branch-4.6/reference/monitoring-apis.html new file mode 100644 index 000000000..66b33af27 --- /dev/null +++ b/branch-4.6/reference/monitoring-apis.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Interfaces

                                +

                                Scylla exposes two interfaces for online monitoring, as described below

                                +
                                +

                                Prometheus API

                                +

                                By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                                +

                                For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                                +

                                You can change the Prometheus listening address and port in scylla.yaml file

                                +
                                # prometheus port
                                +# By default, Scylla opens prometheus API port on port 9180
                                +# setting the port to 0 will disable the prometheus API.
                                +prometheus_port: 9180
                                +#
                                +# prometheus address
                                +# By default, Scylla binds all interfaces to the prometheus API
                                +# It is possible to restrict the listening address to a specific one
                                +prometheus_address: 0.0.0.0
                                +
                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/robots.txt b/branch-4.6/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/branch-4.6/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/branch-4.6/search.html b/branch-4.6/search.html new file mode 100644 index 000000000..9b0118d11 --- /dev/null +++ b/branch-4.6/search.html @@ -0,0 +1,634 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + + + +
                                + + + + + +
                                + + +
                                + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/searchindex.js b/branch-4.6/searchindex.js new file mode 100644 index 000000000..7e55c64f8 --- /dev/null +++ b/branch-4.6/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "6": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 18, 19, 21, 22, 23, 24, 25, 30, 31, 33, 35, 37, 38, 41], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 27, 28, 29, 30, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 27], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 30, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 26, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25, 26], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 26, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 26, 28, 29, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 26, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25, 26], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 27, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 28, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 26, 33], "user": [1, 2, 6, 7, 9, 27, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25, 26], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9], "refer": [1, 6, 9, 13], "upgrad": [1, 10, 13], "lesson": [1, 9, 28, 29, 30], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25, 26], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 27, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 30, 32, 33, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 27, 31, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25, 26], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 28, 31, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 27, 30, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 12, 14, 19, 21, 22, 23, 24, 25, 26], "onc": [2, 12, 21, 25, 32, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 26, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 26, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 28, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 26, 28, 30, 31, 33, 35, 41], "both": [2, 5, 6, 12, 19, 22, 24, 25, 26, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 27, 39, 41], "updat": [2, 5, 10, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 26, 29, 33, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25, 26], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25, 26], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 26, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18, 26], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 26, 28, 33, 34, 41], "advis": [2, 34, 41], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 26, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26], "databas": [2, 5, 7, 21, 30, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 27, 31, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 27, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25, 26], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 10, 12, 14, 16, 19, 21, 22, 24, 25, 26, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 26, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 10, 12, 25], "yaml": [2, 5, 10, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25, 26], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25, 26], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 26, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "1": [2, 5, 6, 7, 8, 12, 14, 16, 20, 22, 24, 25, 26], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 28, 31, 33, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 26, 28, 29, 30, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "24": [2, 14, 25], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25, 26], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 14, 19, 22, 24, 25, 26], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 25, 34], "json": [2, 12, 14], "9": [2, 6, 16, 25], "3": [2, 4, 5, 6, 14, 16, 20, 35], "11": [2, 6, 16], "3000": [2, 5, 6, 22, 24, 25, 26], "1000": [2, 33], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 14, 29, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25, 26], "dir": [2, 7, 8, 22, 24, 25, 26], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 12, 14, 16, 20, 24, 35], "7": [2, 5, 6, 14, 16], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 32, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "42": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25, 26], "prom_rul": [2, 5, 10, 12, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25, 26], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 7, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 26, 28, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25, 26], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 26, 30, 34, 35, 37, 39, 41], "compos": [3, 7], "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 33, 39], "section": [4, 5, 6, 10, 12, 19, 21, 24, 25, 26, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 30, 34, 35, 37, 41], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 26, 31, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25, 26], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 38], "node": [4, 5, 7, 12, 16, 19, 21, 28, 29, 30, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 26, 28, 30, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 25, 30, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 32, 39, 41], "need": [4, 5, 6, 7, 8, 10, 12, 14, 19, 25, 28, 29, 30, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25, 26], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 26, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 28, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 28, 34, 41], "out": [4, 5, 6, 8, 10, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25, 26], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 27, 30, 41], "take": [4, 5, 6, 7, 12, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 26, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25, 26], "help": [5, 7, 10, 14, 41], "pleas": [5, 7, 19], "most": [5, 10, 14, 25, 36, 41], "common": [5, 7, 10, 41], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 10, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25, 26], "consolid": 5, "suggest": [5, 14, 25], "those": [5, 25, 26], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 28, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 30, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 26, 28, 29, 35, 41], "support": [5, 6, 14, 15, 27, 41], "want": [5, 6, 10, 22, 24, 25, 26], "latest": [5, 6, 7, 22, 24, 25, 26], "releas": [5, 21, 22, 23, 24, 25, 26], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25, 26], "http": [5, 6, 8, 19, 21, 22, 24, 25, 26, 30, 31, 38], "com": [5, 6, 22, 24, 25, 26, 30, 31, 38], "archiv": [5, 6, 22, 24, 25, 26], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25, 26], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24, 26], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25, 26], "p": [5, 7, 8, 19, 21, 22, 24, 25, 26], "cd": [5, 6, 22, 24, 25, 26], "verifi": [5, 10, 23], "point": [5, 6, 14, 22, 24, 25, 26], "browser": [5, 6, 8, 14, 19, 22, 24, 25, 26], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 26, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 26, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 32, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 10, 12, 19, 25, 27, 30, 31, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 28, 31, 32, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 26, 30, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24, 26], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 12, 14, 27, 28, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 26, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25, 26], "scrap": [5, 7, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 12, 19, 21, 23, 25, 30, 32, 33, 39, 41], "import": [5, 6, 7, 10, 12, 21, 22, 24, 25, 26, 33], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25, 26], "code": [5, 34], "shell": 5, "correct": [5, 23, 41], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 26], "host": [5, 6, 7, 9, 19, 26], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23, 26], "127": [5, 7, 19], "right": [5, 6, 14, 41], "typic": [5, 14, 25, 28, 30, 39, 41], "node_export": [5, 6, 7, 9, 16, 26], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "5": [5, 6, 14, 16, 19, 26], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 31, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": [5, 18], "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 19, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7, 19], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 10, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25, 26], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 7, 27, 32], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24, 26], "scylla_reactor_util": 5, "At": [5, 14, 24, 25, 26], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25, 26], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 28, 29, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 34, 38], "tabl": [5, 6, 10, 16, 27, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 26, 33, 41], "give": [5, 13, 15], "strongli": [5, 41], "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 27, 30, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 26, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 26, 32, 33], "mention": [5, 14], "previous": [5, 24, 25, 26], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 31, 33, 41], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "48": 6, "10": [6, 10, 14, 16], "47": 6, "44": 6, "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "32": 6, "29": 6, "25": [6, 19], "18": 6, "avoid": [6, 14, 19, 31, 41], "root": [6, 19, 22, 24, 25, 26], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 10, 22, 24, 25, 26], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 30, 41], "higher": [6, 10, 25, 30, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 27, 28, 29], "agent": [6, 7, 8, 9, 16, 19, 26], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7, 26], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25, 26], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 38], "place": [6, 7, 8, 10, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 28, 30, 31, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 10, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25, 26], "2019": [6, 16, 38], "reach": [6, 8, 12, 30, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 30, 31, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 29, 32, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 30, 31, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "experiment": 7, "initi": 7, "stage": 7, "process": [7, 21, 33, 40], "firstli": 7, "along": 7, "env": 7, "prerequisit": 7, "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": [7, 10], "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 27, 28, 29, 30, 31, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25, 26], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 26, 34], "disk": [7, 10, 14, 19, 27, 29, 34], "possibl": [7, 10, 17, 41], "api": [7, 8, 21], "resolv": 7, "explicitli": [7, 14], "ca": 7, "optim": [7, 32, 38, 42], "drop": [7, 40, 41], "while": [7, 10, 19, 21, 22, 24, 25, 26, 33], "cdc": 7, "request": [7, 17, 40], "how": [7, 8, 10, 14, 22, 24, 25, 26, 28, 29, 30, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 10, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25, 26], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 26, 29], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 28, 29, 30, 34, 35, 41], "abov": [8, 22, 24, 25, 26], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 30, 38, 41], "email": [9, 10], "slack": [9, 10, 18], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11], "wrong": [10, 11, 14, 19, 25, 26, 39, 41], "shown": [10, 19, 22, 24, 25, 26], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21, 26], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "error": [10, 14, 25, 34, 35, 37], "annot": 10, "descript": [10, 34], "been": [10, 12], "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "low": [10, 41], "info": 10, "warn": [10, 34], "critic": 10, "inhibit": 10, "prioriti": 10, "mute": 10, "lower": [10, 41], "space": 10, "threshold": 10, "fire": 10, "silenc": 10, "signal": 10, "action": 10, "pager": 10, "duti": 10, "extens": 10, "easier": [10, 14], "dure": [10, 19, 22, 24, 25, 26], "practic": [10, 34, 38], "suitabl": 10, "rememb": 10, "overridden": [10, 14], "duplic": [10, 41], "rout": [10, 30, 41], "repres": 10, "tree": 10, "win": [10, 19], "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 28], "simul": 10, "actual": [10, 37], "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 32, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "shard": [12, 19, 25, 34], "dd": 12, "non": [12, 19, 21, 29, 30, 34, 38, 41], "cost": [12, 41], "skip": [12, 25], "care": [12, 27, 28, 29, 41], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "sever": [13, 15, 42], "explain": [14, 22, 24, 25, 26, 34], "intern": [14, 30, 41], "potenti": [14, 34, 41], "issu": [14, 19, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 31, 41], "tooltip": 14, "msresolut": 14, "share": [14, 26, 33], "sort": [14, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 31, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": 14, "usual": [14, 19, 34, 41], "wrapper": 14, "re": [14, 30], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2023": 16, "2024": 16, "2018": [16, 31], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "ask": 18, "question": 18, "discuss": 18, "forum": 18, "channel": 18, "56090": 19, "old": [19, 22, 23, 24, 25, 26], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": 19, "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 30, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 27, 28, 29, 31, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "fallback": 19, "mechan": [19, 25, 28], "present": [19, 25], "newer": [19, 24, 25, 26], "reli": [19, 25, 41], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25, 26, 41], "increas": [19, 31, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25, 26], "migrat": [21, 22, 24, 26], "lose": 21, "histor": [21, 25], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25, 26], "3001": [21, 22, 24, 25, 26], "9091": [21, 22, 24, 25, 26], "9094": 21, "fail": [21, 28, 30, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25, 26], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25, 26], "back": [21, 28], "uninstal": [22, 24, 25, 26], "minor": [22, 24, 25, 26], "9095": [22, 24, 25, 26], "brows": [22, 24, 25, 26], "satisfi": [22, 24, 25, 26], "shut": [22, 24, 25, 26], "caus": [22, 24, 25, 26, 30, 41], "blackout": [22, 24, 25, 26], "normal": [22, 24, 25, 26], "oper": [22, 24, 25, 26, 34, 41], "complet": [22, 24, 25, 26], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25, 26], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 27, 34, 41], "ensur": 25, "patch": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 29], "latenc": [25, 30, 33, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 28], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 28, 29, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "itself": 26, "almost": 26, "alwai": [26, 32], "sylladb": 26, "prevent": [26, 41], "primari": [27, 41], "kei": [27, 41], "scan": 27, "These": [27, 41], "kind": [27, 41], "bigger": 27, "replicationfactor": [28, 29], "piec": 28, "determin": [28, 29, 35, 41], "repli": [28, 29, 31, 35, 37, 41], "unavail": [28, 41], "client": [28, 31, 34, 41], "respond": 28, "accompani": 28, "deep": 28, "understand": 28, "acknowledg": 29, "coordin": [29, 30, 35, 37, 41], "hint": 29, "fact": 29, "yet": 29, "ideal": [30, 41], "resourc": [30, 41], "replic": [30, 35, 37, 41], "prepar": [30, 34, 38], "statement": [30, 32, 34, 38], "balanc": [30, 33, 34, 41], "polici": 30, "cours": 30, "intro": 30, "recap": 30, "ring": [30, 41], "architectur": 30, "chunk": [31, 41], "overal": [31, 33, 41], "thu": 31, "www": [31, 38], "07": 31, "13": 31, "effici": [31, 41], "concret": 32, "thumb": 32, "favor": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "solv": 34, "categori": [34, 41], "jump": 34, "cell": 34, "model": [34, 38, 40, 41], "awar": 34, "due": 34, "unsatisfi": 34, "faulti": 34, "cach": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "bottleneck": 38, "explan": 38, "08": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "repair": 40, "queue": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "order": 41, "BY": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13, 26], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 34, 42], "us": [2, 5, 6, 8, 12, 14, 27, 28, 29, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25, 26], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25, 26], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25, 26], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 31, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": [6, 17], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25, 26], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 26, 34, 41], "all": [7, 22, 24, 25, 26, 28], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25, 26], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 28, 29, 35, 41], "architectur": 9, "sever": 10, "ad": [10, 12, 14], "modifi": [10, 14], "tip": 10, "when": 10, "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25, 26], "limit": 14, "consist": [14, 28, 29, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25, 26], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25, 26], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25, 26], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25, 26], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25, 26], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 30, 31, 32, 38], "empti": 19, "reduc": 19, "total": 19, "number": [19, 26], "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25, 26], "latest": 21, "new": [21, 22, 23, 24, 25, 26], "4": [21, 25, 26], "move": [21, 22, 24, 25, 26], "old": 21, "b": [21, 26], "rollback": [21, 22, 23, 24, 25, 26], "link": [21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 38], "y": [22, 24, 25, 26], "": [22, 24, 25, 26], "i": [22, 24, 25, 26, 36], "run": [22, 24, 25, 26], "correct": [22, 24, 25, 26], "correctli": [22, 24, 26], "kill": [22, 24, 25, 26], "test": [24, 25, 26], "mode": [24, 25, 26], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "port": 26, "some": [27, 28, 29, 30, 31, 32, 35, 37], "allow": [27, 41], "filter": [27, 41], "univers": [28, 29, 30], "ani": 29, "token": [30, 41], "awar": [30, 41], "select": 31, "non": [31, 32], "page": [31, 41], "blog": [31, 38], "prepar": [32, 39, 41], "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "revers": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some SELECT queries are non-paged": [[31, "some-select-queries-are-non-paged"]], "Blog-post Links": [[31, "blog-post-links"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some queries are non-prepared": [[32, "some-queries-are-non-prepared"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Some queries are not token-aware": [[30, "some-queries-are-not-token-aware"]], "University link": [[30, "university-link"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Upgrade Procedure": [[24, "upgrade-procedure"], [26, "upgrade-procedure"], [22, "upgrade-procedure"], [25, "upgrade-procedure"], [23, "upgrade-procedure"], [21, "upgrade-procedure"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Setting the server\u2019s files": [[24, "setting-the-server-s-files"], [26, "setting-the-server-s-files"], [22, "setting-the-server-s-files"], [25, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[24, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"], [22, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[24, "validate-the-version-installed-correctly"], [26, "validate-the-version-installed-correctly"], [22, "validate-the-version-installed-correctly"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Kill all containers": [[24, "kill-all-containers"], [26, "kill-all-containers"], [22, "kill-all-containers"], [25, "kill-all-containers"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Related Links": [[24, "related-links"], [26, "related-links"], [22, "related-links"], [25, "related-links"], [23, "related-links"], [21, "related-links"]], "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b": [[26, "upgrade-guide-scylladb-monitoring-4-x-a-to-scylladb-monitoring-4-y-b"]], "Install 4.y.b (The new version)": [[26, "install-4-y-b-the-new-version"]], "Validate the port numbers": [[26, "validate-the-port-numbers"]], "Killing the new 4.y.b Monitoring stack in testing mode": [[26, "killing-the-new-4-y-b-monitoring-stack-in-testing-mode"]], "Move to version 4.y.b (the new version)": [[26, "move-to-version-4-y-b-the-new-version"]], "Rollback to version 4.x.a": [[26, "rollback-to-version-4-x-a"]], "Some queries use ALLOW FILTERING": [[27, "some-queries-use-allow-filtering"]], "Some queries use Consistency Level: ALL": [[28, "some-queries-use-consistency-level-all"]], "Link to Scylla university": [[28, "link-to-scylla-university"], [29, "link-to-scylla-university"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Some queries use Consistency Level: ANY": [[29, "some-queries-use-consistency-level-any"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[17, "prometheus-api"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alerts severity": [[10, "alerts-severity"]], "Adding Alerts": [[10, "adding-alerts"]], "Modifying Alerts": [[10, "modifying-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "System Overload": [[40, "system-overload"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Minimal Production System Recommendations": [[4, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[4, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[4, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "ScyllaDB Monitoring Stack": [[9, "scylladb-monitoring-stack"], [1, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/branch-4.6/sitemap.xml b/branch-4.6/sitemap.xml new file mode 100644 index 000000000..b234168cc --- /dev/null +++ b/branch-4.6/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/branch-4.6/troubleshooting/index.html b/branch-4.6/troubleshooting/index.html new file mode 100644 index 000000000..4ba4314a2 --- /dev/null +++ b/branch-4.6/troubleshooting/index.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Troubleshooting Guide for Scylla Monitoring Stack

                                +
                                +
                                +

                                Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/troubleshooting/monitor-troubleshoot.html b/branch-4.6/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..b8878c653 --- /dev/null +++ b/branch-4.6/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,876 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Troubleshoot Scylla Monitoring Stack

                                +

                                This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                                +
                                +

                                Problem

                                +
                                +

                                Scylla-Manager 2.2 with Duplicate information

                                +

                                Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                                +
                                  +
                                • For Manager server: from 56090 to 5090

                                • +
                                • For Manager Agent: from 56090 to 5090

                                • +
                                +

                                For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                                +

                                However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                                +

                                The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                                +

                                Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                                +
                                +
                                +

                                A Container Fails To Start

                                +

                                When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                                +
                                Wait for Prometheus container to start........Error: Prometheus container failed to start
                                +
                                +
                                +

                                Should this happen, check the Docker logs for more information.

                                +
                                docker logs aprom
                                +
                                +
                                +

                                Usually the reason for the failure is described in the logs.

                                +
                                +
                                +

                                Files And Directory Permissions

                                +
                                +

                                Note

                                +

                                Avoid running Docker containers as root.

                                +
                                +

                                The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                                +

                                If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                                +
                                +

                                Note

                                +

                                If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                                +
                                +

                                For example if your Prometheus data directory is /prom-data and you are using centos user

                                +
                                ls -la /|grep prom-data
                                +
                                +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                                +
                                +sudo chown -R centos:centos /prom-data
                                +
                                +ls -la /|grep prom-data
                                +
                                +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                                +
                                +
                                +
                                +
                                +

                                No Data Points

                                +

                                No data points on all data charts.

                                +
                                +

                                Solution

                                +

                                If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                                +
                                  +
                                1. Login to the Prometheus console:

                                2. +
                                3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                                4. +
                                5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                                6. +
                                +
                                +
                                  +
                                • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                                • +
                                • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                                • +
                                • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                                • +
                                +
                                +

                                For example:

                                +
                                ./start-all.sh -v 3.1
                                +
                                +
                                +

                                More on start-all.sh options.

                                +
                                +
                                +
                                +

                                Grafana Chart Shows Error (!) Sign

                                +

                                Run this procedure on the Scylla Monitoring Stack server.

                                +

                                If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                                +
                                +

                                Solution

                                +

                                On the Scylla Monitoring Stack server:

                                +
                                  +
                                1. Check Prometheus is running using docker ps.

                                2. +
                                +
                                  +
                                • If it is not running check the prometheus.yml for errors.

                                • +
                                +

                                For example:

                                +
                                CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                                +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                                +
                                +
                                +
                                  +
                                • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                                • +
                                +
                                +
                                +
                                +

                                Grafana Shows Server Level Metrics, but not Scylla Metrics

                                +

                                Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                                +
                                +

                                Solution

                                +
                                  +
                                • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                                • +
                                +

                                For example

                                +
                                curl 172.17.0.2:9180/metrics
                                +
                                +
                                +
                                +
                                +
                                +

                                Grafana Shows Scylla Metrics, but not Server Level Metrics

                                +

                                Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                                +
                                +

                                Solution

                                +

                                1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                                +
                                  +
                                1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                                2. +
                                +
                                +
                                +

                                Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                                +

                                While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                                +

                                If the node_exporter service is not starting it may need to be updated manually.

                                +

                                Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                                +
                                +
                                +
                                +

                                Latencies Graphs Are empty

                                +

                                Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                                +

                                During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                                +

                                Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                                +

                                If only the latency graphs are missing, it is because of missing recording rules.

                                +

                                This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                                +

                                If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                                +
                                +
                                +

                                Reducing the total number of metrics

                                +

                                In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                                +
                                +

                                Remove interrupts from node_exporter

                                +

                                By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                                +
                                +
                                +
                                +

                                Working with Wireshark

                                +

                                No metrics shown in the Scylla Monitoring Stack.

                                +
                                  +
                                1. Install wireshark

                                2. +
                                +

                                2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                                +

                                For example:

                                +
                                tshark -i eth0 -f "dst port 9180"
                                +
                                +
                                +

                                Capture from Scylla node towards Scylla Monitoring Stack server.

                                +

                                In this example, Scylla is running.

                                +
                                Monitor ip        Scylla node ip
                                +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                                +
                                +
                                +

                                In this example, Scylla is not running

                                +
                                Monitor ip        Scylla node ip
                                +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                                +
                                +
                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/index.html b/branch-4.6/upgrade/index.html new file mode 100644 index 000000000..f457ef198 --- /dev/null +++ b/branch-4.6/upgrade/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Upgrade Scylla Monitoring Stack

                                +
                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..c7a759c2d --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,784 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                                +

                                Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                                +
                                +

                                Upgrade Procedure

                                +
                                +

                                1. Upgrade to the latest 1.x version

                                +

                                Before starting the upgrade procedure, make sure you are running the latest 1.x version

                                +
                                +
                                +

                                2. Install the new monitoring stack

                                +
                                  +
                                1. Download the 2.x version from the release page.

                                2. +
                                3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                                4. +
                                5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                                  +
                                    +
                                  • scylla_servers.yml

                                  • +
                                  • scylla_manager_servers.yml

                                  • +
                                  • node_exporter_servers.yml

                                  • +
                                  +
                                6. +
                                7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                                8. +
                                +
                                ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                                +
                                +
                                +
                                +

                                Note

                                +

                                Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                                +
                                +

                                While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                                +
                                ./kill-all.sh -g 3001 -p 9091 -m 9094
                                +
                                +
                                +
                                +

                                Validation

                                +

                                Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                                +
                                +
                                +
                                +

                                3. Alerting Rules

                                +

                                Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                                +
                                +
                                +

                                4. Moving to Prometheus 2.x

                                +

                                Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                                +

                                Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                                +
                                +

                                a. Set the old system

                                +

                                The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                                +
                                  +
                                • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                                • +
                                • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                                • +
                                +
                                +

                                Note

                                +

                                After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                                +
                                +
                                +
                                +

                                b. Set the new system

                                +

                                The following step will allow the new monitoring system to read historical metrics from the old system.

                                +
                                  +
                                • In the Prometheus prometheus.yml.template file add the following at the end:

                                • +
                                +
                                remote_read:
                                +  - url: "http://{ip}:9111/api/v1/read"
                                +
                                +
                                +

                                Where {ip} is the ip of the old system.

                                +
                                  +
                                • restart the new stack

                                • +
                                +
                                +
                                +
                                +

                                Validate the upgrade

                                +

                                You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                                +
                                +
                                +
                                +

                                Rollback

                                +

                                In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..7312ffd2b --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,778 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                                +
                                +

                                Upgrade Procedure

                                +

                                We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                +

                                Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                +
                                +

                                Install 2.y (The new version)

                                +
                                wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                                +unzip scylla-monitoring-2.y.zip
                                +cd scylla-monitoring-scylla-monitoring-2.y/
                                +
                                +
                                +

                                Replace “y” with the new minor release number, for example, 2.1.zip

                                +
                                +
                                +

                                Setting the server’s files

                                +

                                Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                                +
                                cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                                +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                                +
                                +
                                +
                                +
                                +

                                Validate the new version is running the correct version

                                +

                                Starting from Scylla-Monitoring version 2.2, you can run:

                                +
                                ./start-all.sh --version
                                +
                                +
                                +

                                To validate the Scylla-Monitoring version.

                                +
                                +
                                +

                                Validate the version installed correctly

                                +

                                To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                                +
                                ./start-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                Browse to http://{ip}:9091 +And check the Grafana dashboard

                                +

                                Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                                +
                                +

                                Caution

                                +

                                Important: do not use the local dir flag when testing!

                                +
                                +

                                When you are satisfied with the data in the dashboard, you can shut down the containers.

                                +
                                +

                                Caution

                                +

                                Important: Do not kill the 2.x version that is currently running.

                                +
                                +

                                Use the following command to kill the containers:

                                +
                                ./kill-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                You can start and stop the new 2.y version while testing.

                                +
                                +
                                +

                                Move to version 2.y (the new version)

                                +

                                Note: migrating will cause a few seconds of blackout in the system.

                                +

                                We assume that you are using external volume to store the metrics data.

                                +
                                +

                                Kill all containers

                                +

                                Follow the instruction on how to kill the 2.y version when in testing mode.

                                +

                                To kill the 2.x version containers, run:

                                +
                                ./kill-all.sh
                                +
                                +
                                +

                                Start version 2.y in normal mode

                                +

                                From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                                +
                                ./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +

                                Point your browser to http://{ip}:3000 and see that the data is there.

                                +
                                +
                                +
                                +

                                Rollback to version 2.x

                                +

                                To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                                +

                                To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                                +
                                ./kill-all.sh
                                +cd /path/to/scylla-grafana-2.x/
                                +./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +
                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..519ac7065 --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,742 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                                +

                                Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                                +
                                +

                                Upgrade Procedure

                                +
                                +

                                1. Validate node_exporter version

                                +

                                Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                                +

                                If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                                +
                                +
                                +

                                2. Install the new monitoring stack

                                +
                                  +
                                1. Download the 3.x version from the release page.

                                2. +
                                3. Unzip it into a different directory.

                                4. +
                                5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                                  +
                                    +
                                  • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                                  • +
                                  • scylla_manager_servers.yml

                                  • +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                                  +
                                  +
                                  +
                                6. +
                                7. Stop the old monitoring stack

                                  +
                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +
                                  +
                                8. +
                                9. Start the new monitoring stack

                                  +
                                  +
                                  ./start-all.sh -d /prometheus-data-path
                                  +
                                  +
                                  +
                                  +
                                10. +
                                +
                                +
                                +

                                Validate the upgrade

                                +

                                You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                                +

                                Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                                +
                                +
                                +
                                +

                                Rollback

                                +

                                To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..02ee3e91b --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,786 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                                +
                                +

                                Upgrade Procedure

                                +

                                We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                +

                                Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                +
                                +

                                Install 3.y (The new version)

                                +
                                wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                                +unzip scylla-monitoring-3.y.zip
                                +cd scylla-monitoring-scylla-monitoring-3.y/
                                +
                                +
                                +

                                Replace “y” with the new minor release number, for example, 3.0.1.zip

                                +
                                +
                                +

                                Setting the server’s files

                                +

                                Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                +
                                cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                +
                                +
                                +
                                +
                                +

                                Validate the new version is running the correct version

                                +

                                Starting from Scylla-Monitoring version 2.2, you can run:

                                +
                                ./start-all.sh --version
                                +
                                +
                                +

                                To validate the Scylla-Monitoring version.

                                +
                                +
                                +

                                Validate the version installed correctly

                                +

                                To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                                +
                                ./start-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                Browse to http://{ip}:9091 +And check the Grafana dashboard

                                +

                                Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                +
                                +

                                Caution

                                +

                                Important: do not use the local dir flag when testing!

                                +
                                +

                                When you are satisfied with the data in the dashboard, you can shut down the containers.

                                +
                                +

                                Caution

                                +

                                Important: Do not kill the 3.x version that is currently running.

                                +
                                +
                                +
                                +

                                Killing the new 3.y Monitoring stack in testing mode

                                +

                                Use the following command to kill the containers:

                                +
                                ./kill-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                You can start and stop the new 3.y version while testing.

                                +
                                +
                                +

                                Move to version 3.y (the new version)

                                +

                                Note: migrating will cause a few seconds of blackout in the system.

                                +

                                We assume that you are using external volume to store the metrics data.

                                +
                                +

                                Kill all containers

                                +

                                At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                +

                                Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                                +

                                kill the older 3.x version containers by running:

                                +
                                ./kill-all.sh
                                +
                                +
                                +

                                Start version 3.y in normal mode

                                +

                                From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                                +
                                ./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +

                                Point your browser to http://{ip}:3000 and see that the data is there.

                                +
                                +
                                +
                                +

                                Rollback to version 3.x

                                +

                                To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                +

                                To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                                +
                                ./kill-all.sh
                                +cd /path/to/scylla-grafana-3.x/
                                +./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +
                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..320527dc8 --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,929 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                                +
                                +

                                Upgrade Procedure

                                +

                                We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                                +

                                Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                                +
                                +

                                Install 4.y (The new version)

                                +
                                wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                                +unzip scylla-monitoring-4.y.zip
                                +cd scylla-monitoring-scylla-monitoring-4.y/
                                +
                                +
                                +

                                Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                                +
                                +
                                +

                                Setting the server’s files

                                +

                                Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                +
                                cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                +
                                +
                                +
                                +
                                +

                                Validate the new version is running the correct version

                                +

                                run:

                                +
                                ./start-all.sh --version
                                +
                                +
                                +

                                To validate the Scylla-Monitoring version.

                                +
                                +
                                +
                                +

                                Running in test mode

                                +

                                This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                                +
                                +

                                Running second monitoring stack

                                +

                                We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                                +
                                ./start-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                Browse to http://{ip}:9091 and check the Grafana dashboard.

                                +

                                Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                +
                                +

                                Caution

                                +

                                Important: do not use the local dir flag when testing!

                                +
                                +

                                When you are satisfied with the data in the dashboard, you can shut down the containers.

                                +
                                +

                                Caution

                                +

                                Important: Do not kill the 3.x version that is currently running!

                                +
                                +
                                +
                                +

                                Killing the new 4.y Monitoring stack in testing mode

                                +

                                Use the following command to kill the containers:

                                +
                                ./kill-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                You can start and stop the new 4.y version while testing.

                                +
                                +
                                +
                                +

                                Migrating

                                +
                                +

                                Move to version 4.y (the new version)

                                +

                                Note: migrating will cause a few seconds of blackout in the system.

                                +

                                We assume that you are using external volume to store the metrics data.

                                +
                                +

                                Backup

                                +

                                We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                                +
                                +
                                +

                                Kill all containers

                                +

                                At this point you have two monitoring stacks installed with the older version running.

                                +

                                If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                                +

                                kill the older 3.x version containers by running:

                                +
                                ./kill-all.sh
                                +
                                +
                                +

                                Start version 4.y in normal mode

                                +

                                From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                                +
                                ./start-all.sh -d /path/to/copy/data/dir
                                +
                                +
                                +

                                Point your browser to http://{ip}:3000 and see that the data is there.

                                +
                                +
                                +
                                +

                                Rollback to version 3.x

                                +

                                To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                +

                                To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                                +
                                ./kill-all.sh
                                +cd /path/to/scylla-grafana-3.x/
                                +./start-all.sh -d /path/to/original/data/dir
                                +
                                +
                                +
                                +
                                +
                                +

                                Post-installation: Metrics back-filling

                                +

                                Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                                +

                                For example, this is a recording rule that calculates the p99 write latency:

                                +
                                - record: wlatencyp99
                                +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                                +  labels:
                                +    by: "instance,shard"
                                +
                                +
                                +

                                For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                                +

                                Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                                +
                                +
                                +

                                Note

                                +

                                If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                                +
                                +
                                +
                                +../_images/before-backfilling.png +
                                +

                                This is an example of missing latency graph

                                +
                                +
                                +

                                The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                                +

                                For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                                +

                                In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                                +

                                The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                                +
                                +

                                Determine the backfilling period

                                +

                                When you run the backfilling process you need to determine the start time and end time.

                                +
                                +

                                Determine the start time

                                +

                                The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                                +

                                If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                                +

                                For the rest of this example, we will assume that your retention time is 360 days.

                                +
                                +
                                +

                                Determine the end time

                                +

                                Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                                +

                                If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                                +

                                That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                                +

                                The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                                +
                                +
                                +
                                +

                                Backfilling Process

                                +
                                +

                                backup

                                +

                                If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                                +

                                To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                                +
                                +
                                +

                                Restart the monitoring stack

                                +

                                You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                                +

                                -b "--storage.tsdb.allow-overlapping-blocks"

                                +
                                +
                                +

                                Create the data files

                                +

                                We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                                +

                                The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                                +

                                Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                                +
                                docker exec -it aprom sh
                                +cd /prometheus/data/
                                +promtool tsdb create-blocks-from rules \
                                +--start $start \
                                +--end $end \
                                +--url http://localhost:9090 \
                                +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                                +
                                +
                                +

                                It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                                +
                                +
                                +

                                Note

                                +

                                Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                                +
                                +
                                +
                                +
                                +

                                Copy the data files

                                +

                                Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                                +

                                Copy the data files to the Prometheus directory:

                                +
                                cp data/* .
                                +
                                +
                                +

                                The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                                +

                                Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                                +
                                +../_images/after-backfilling.jpg +
                                +

                                Un example: after loading half of the data

                                +
                                +
                                +
                                +
                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/branch-4.6/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..c9af132c6 --- /dev/null +++ b/branch-4.6/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,801 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b

                                +

                                This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1.

                                +
                                +

                                Upgrade Procedure

                                +

                                We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                +

                                Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                +
                                +

                                Install 4.y.b (The new version)

                                +
                                wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip
                                +unzip scylla-monitoring-4.y.b.zip
                                +cd scylla-monitoring-scylla-monitoring-4.y.b/
                                +
                                +
                                +

                                Replace “y” with the new minor release number, for example, 4.0.1.zip

                                +
                                +
                                +

                                Setting the server’s files

                                +

                                Copy the target files scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                +
                                cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/
                                +cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/
                                +
                                +
                                +
                                +

                                Validate the port numbers

                                +

                                ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent.

                                +

                                Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target.

                                +
                                +

                                Caution

                                +

                                As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics.

                                +
                                +
                                +
                                +
                                +

                                Validate the new version is running the correct version

                                +

                                Run:

                                +
                                ./start-all.sh --version
                                +
                                +
                                +

                                To validate the Scylla-Monitoring version.

                                +
                                +
                                +

                                Validate the version installed correctly

                                +

                                To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack.

                                +
                                ./start-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                Browse to http://{ip}:9091 +And check the Grafana dashboard

                                +

                                Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                +
                                +

                                Caution

                                +

                                Important: do not use the local dir flag when testing!

                                +
                                +

                                When you are satisfied with the data in the dashboard, you can shut down the containers.

                                +
                                +

                                Caution

                                +

                                Important: Do not kill the 4.x.a version that is currently running.

                                +
                                +
                                +
                                +

                                Killing the new 4.y.b Monitoring stack in testing mode

                                +

                                Use the following command to kill the containers:

                                +
                                ./kill-all.sh -p 9091 -g 3001 -m 9095
                                +
                                +
                                +

                                You can start and stop the new 4.y.b version while testing.

                                +
                                +
                                +

                                Move to version 4.y.b (the new version)

                                +

                                Note: migrating will cause a few seconds of blackout in the system.

                                +

                                We assume that you are using external volume to store the metrics data.

                                +
                                +

                                Kill all containers

                                +

                                At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                +

                                Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y.b Monitoring stack in testing mode +in the previous section

                                +

                                kill the older 4.x.a version containers by running:

                                +
                                ./kill-all.sh
                                +
                                +
                                +

                                Start version 4.y.b in normal mode

                                +

                                From the new root of the scylla-monitoring-scylla-monitoring-4.y.b run

                                +
                                ./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +

                                Point your browser to http://{ip}:3000 and see that the data is there.

                                +
                                +
                                +
                                +

                                Rollback to version 4.x.a

                                +

                                To rollback during the testing mode, follow Killing the new 4.y.b Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                +

                                To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run:

                                +
                                ./kill-all.sh
                                +cd /path/to/scylla-grafana-4.x.a/
                                +./start-all.sh -d /path/to/data/dir
                                +
                                +
                                +
                                +
                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlAllowFiltering.html b/branch-4.6/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..9c9dd6cbc --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Some queries use ALLOW FILTERING

                                +

                                Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                                +

                                These kinds of queries can create a bigger load on Scylla, and should be used with care.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlCLAll.html b/branch-4.6/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..7e45f98e2 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Some queries use Consistency Level: ALL

                                +

                                Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                                +

                                Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                                +

                                Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlCLAny.html b/branch-4.6/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..85beaa0e9 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Some queries use Consistency Level: ANY

                                +

                                Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                                +

                                Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlNoTokenAware.html b/branch-4.6/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..5a4891f93 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Some queries are not token-aware

                                +

                                Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                                +

                                Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlNonPaged.html b/branch-4.6/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..c94647337 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Some SELECT queries are non-paged

                                +

                                By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                                +
                                +

                                Blog-post Links

                                +

                                https://www.scylladb.com/2018/07/13/efficient-query-paging/

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/cqlNonPrepared.html b/branch-4.6/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..f4f9c6eef --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Some queries are non-prepared

                                +

                                Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/heavyCompaction.html b/branch-4.6/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..65f344524 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Compaction takes lots of memory and CPU

                                +

                                ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                                +

                                If this is the case, you can do one of the following:

                                +
                                  +
                                • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                                  +
                                  +
                                    +
                                  • In the scylla.yml configuration file: compaction_static_shares: 100

                                  • +
                                  • In the command line when starting ScyllaDB: --compaction-static-shares 100

                                  • +
                                  +
                                  +

                                  You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                                  +
                                • +
                                • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                                • +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/index.html b/branch-4.6/use-monitoring/advisor/index.html new file mode 100644 index 000000000..f58b5bf01 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/index.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Scylla Monitoring Stack Advisor

                                +
                                +
                                +

                                The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                                +
                                +

                                The Advisor section

                                +
                                +../../_images/advisor_panel.png +
                                +

                                The Advisor section

                                +
                                +
                                +

                                The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                                +

                                For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                                +

                                Each Advisor issue is explained in detail:

                                + +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/nodeCLErrors.html b/branch-4.6/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..4c5445b5b --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Some operation failed due to unsatisfied consistency level

                                +

                                ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                                +

                                For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                                +

                                When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/nodeIOErrors.html b/branch-4.6/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..fb30d0fde --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                I/O Errors can indicate a node with a faulty disk

                                +

                                I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/nodeLocalErrors.html b/branch-4.6/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..3b303dcb2 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Some operations failed on the replica side

                                +

                                ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                                +

                                An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/nonBalancedcqlTraffic.html b/branch-4.6/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..0a11919eb --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                CQL queries are not balanced among shards

                                +

                                For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                                +

                                There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                                +
                                +

                                Blog post link

                                +

                                https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/preparedCacheEviction.html b/branch-4.6/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..e628ca3e1 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                Prepared statements cache eviction

                                +

                                Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                                +
                                  +
                                • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                                • +
                                • The prepared statements cache might be too small for the number of prepared statements.

                                • +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/advisor/systemOverload.html b/branch-4.6/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..514a1b833 --- /dev/null +++ b/branch-4.6/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                System Overload

                                +

                                There could be multiple indications that a system is overloaded:

                                +
                                  +
                                • Timeouts

                                • +
                                • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                                • +
                                • CPU at 100% when no background process (like compaction or repair) runs.

                                • +
                                • Queues are getting filled.

                                • +
                                +

                                If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/cql-optimization.html b/branch-4.6/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..b812f9d81 --- /dev/null +++ b/branch-4.6/use-monitoring/cql-optimization.html @@ -0,0 +1,786 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + + + +
                                +

                                The CQL Optimization

                                +

                                The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                                +
                                +../_images/cql_optimization_master.png +
                                +

                                The CQL Dashboard

                                +
                                +
                                +

                                The upper part of the dashboard holds CQL related metrics.

                                +

                                The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                                +
                                +

                                Note

                                +

                                Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                                +
                                +

                                The following sections describe each of the dashboard’s panel

                                +
                                +

                                Prepared Statements

                                +

                                Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                                +

                                Using prepared statements has the following benefits:

                                +
                                  +
                                • The database only needs to parse the query once

                                • +
                                • The driver can route the query to the right node

                                • +
                                • Using place-holders and values is safer and prevents CQL-Injection

                                • +
                                +

                                The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                                +

                                The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                                +
                                +
                                +

                                Token Aware

                                +

                                Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                                +

                                Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                                +

                                The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                                +

                                The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                                +
                                +
                                +

                                Paged Queries

                                +

                                By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                                +

                                The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                                +

                                The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                                +
                                +
                                +

                                Reversed CQL Reads

                                +

                                ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                                +

                                We strongly recommend using use the correct ordering. +Querying with an order different than the order the CLUSTERING ORDER BY was defined is supported, but not advisable.

                                +

                                For example, look at the following table:

                                +
                                CREATE TABLE ks1.table_demo (
                                +   category text,
                                +   type int,
                                +   PRIMARY KEY (category, type))
                                +WITH CLUSTERING ORDER BY (type DESC);
                                +
                                +
                                +

                                The following query uses reverse order:

                                +
                                select * from ks1.table_demo where category='cat1' order by type ASC;
                                +
                                +
                                +

                                The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                                +

                                The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                                +
                                +
                                +

                                ALLOW FILTERING

                                +

                                Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                                +

                                These kinds of queries can create a big load on the system, and should be used with care.

                                +

                                The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                                +

                                The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                                +

                                The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                                +

                                The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                                +

                                The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                                +
                                +
                                +

                                Consistency Level

                                +

                                Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                                +

                                The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                                +

                                Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                                +

                                The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                                +

                                The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                                +

                                The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                                +

                                The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                                +
                                +
                                +

                                Cross DC

                                +

                                Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                                +
                                +
                                +

                                Cross DC Consistency Level

                                +

                                Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                                +
                                +
                                +

                                Cross DC read requests

                                +
                                +

                                Note

                                +

                                The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                                +
                                +

                                In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                                +

                                The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                                +
                                +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/branch-4.6/use-monitoring/index.html b/branch-4.6/use-monitoring/index.html new file mode 100644 index 000000000..1e43eab90 --- /dev/null +++ b/branch-4.6/use-monitoring/index.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                + + + +
                                +
                                + Menu +
                                +
                                +
                                +
                                +
                                + + + + +
                                + +
                                + +
                                +

                                Using Scylla Monitoring Stack

                                +
                                +
                                +

                                There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                                + +
                                + + +
                                + + + + + + + +
                                + +
                                + + + + +
                                + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..c74c38693 --- /dev/null +++ b/index.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/master/.buildinfo b/master/.buildinfo new file mode 100644 index 000000000..7b87ed094 --- /dev/null +++ b/master/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 8ff15c8441916609de45a2483cb81f11 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/master/.doctrees/common/monitor-description.doctree b/master/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..557322fbb Binary files /dev/null and b/master/.doctrees/common/monitor-description.doctree differ diff --git a/master/.doctrees/environment.pickle b/master/.doctrees/environment.pickle new file mode 100644 index 000000000..e8f3da377 Binary files /dev/null and b/master/.doctrees/environment.pickle differ diff --git a/master/.doctrees/index.doctree b/master/.doctrees/index.doctree new file mode 100644 index 000000000..452344674 Binary files /dev/null and b/master/.doctrees/index.doctree differ diff --git a/master/.doctrees/install/docker-compose.doctree b/master/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..99d9f5daf Binary files /dev/null and b/master/.doctrees/install/docker-compose.doctree differ diff --git a/master/.doctrees/install/index.doctree b/master/.doctrees/install/index.doctree new file mode 100644 index 000000000..24bac7120 Binary files /dev/null and b/master/.doctrees/install/index.doctree differ diff --git a/master/.doctrees/install/min-prod-hw.doctree b/master/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..329348937 Binary files /dev/null and b/master/.doctrees/install/min-prod-hw.doctree differ diff --git a/master/.doctrees/install/monitor-without-docker.doctree b/master/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..cebe158f2 Binary files /dev/null and b/master/.doctrees/install/monitor-without-docker.doctree differ diff --git a/master/.doctrees/install/monitoring-stack.doctree b/master/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..f59d36fff Binary files /dev/null and b/master/.doctrees/install/monitoring-stack.doctree differ diff --git a/master/.doctrees/install/start-all.doctree b/master/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..bcf7c96e7 Binary files /dev/null and b/master/.doctrees/install/start-all.doctree differ diff --git a/master/.doctrees/install/thanos.doctree b/master/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..fc2791dc3 Binary files /dev/null and b/master/.doctrees/install/thanos.doctree differ diff --git a/master/.doctrees/intro.doctree b/master/.doctrees/intro.doctree new file mode 100644 index 000000000..2f2cc22ce Binary files /dev/null and b/master/.doctrees/intro.doctree differ diff --git a/master/.doctrees/procedures/alerts/alerting.doctree b/master/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..a1a0bb8a9 Binary files /dev/null and b/master/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/master/.doctrees/procedures/alerts/index.doctree b/master/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..4603a7cdf Binary files /dev/null and b/master/.doctrees/procedures/alerts/index.doctree differ diff --git a/master/.doctrees/procedures/datadog/index.doctree b/master/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..d914cb0af Binary files /dev/null and b/master/.doctrees/procedures/datadog/index.doctree differ diff --git a/master/.doctrees/procedures/index.doctree b/master/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..44e8fd468 Binary files /dev/null and b/master/.doctrees/procedures/index.doctree differ diff --git a/master/.doctrees/procedures/updating-dashboard.doctree b/master/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..555a88165 Binary files /dev/null and b/master/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/master/.doctrees/reference/index.doctree b/master/.doctrees/reference/index.doctree new file mode 100644 index 000000000..8fb58f76c Binary files /dev/null and b/master/.doctrees/reference/index.doctree differ diff --git a/master/.doctrees/reference/matrix.doctree b/master/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..7baf7ecc5 Binary files /dev/null and b/master/.doctrees/reference/matrix.doctree differ diff --git a/master/.doctrees/reference/monitoring-apis.doctree b/master/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..c7f598d5a Binary files /dev/null and b/master/.doctrees/reference/monitoring-apis.doctree differ diff --git a/master/.doctrees/troubleshooting/index.doctree b/master/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..f42a7aa3d Binary files /dev/null and b/master/.doctrees/troubleshooting/index.doctree differ diff --git a/master/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/master/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..44256615a Binary files /dev/null and b/master/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/master/.doctrees/upgrade/index.doctree b/master/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..ce4e59679 Binary files /dev/null and b/master/.doctrees/upgrade/index.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..b7982eaac Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..9c67979d0 Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..4b76112b8 Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..782b417b5 Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..856fef595 Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/master/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..f691f99c2 Binary files /dev/null and b/master/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/master/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..b62421ee6 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/master/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..8510095ab Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/master/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..7bf1dd0ce Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/master/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..2e939da9e Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/master/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..3887d7edf Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/master/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..8c968c0f5 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/master/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..1d25237e1 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/index.doctree b/master/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..a545a95d7 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/master/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..3374cfaf3 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/master/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..42b04a225 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/master/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..76b2da28d Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/master/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..8dacff68f Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/master/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..c6b453106 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/master/.doctrees/use-monitoring/advisor/systemOverload.doctree b/master/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..4a3a132b1 Binary files /dev/null and b/master/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/master/.doctrees/use-monitoring/cql-optimization.doctree b/master/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..4fe503f53 Binary files /dev/null and b/master/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/master/.doctrees/use-monitoring/index.doctree b/master/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..bd3811b7f Binary files /dev/null and b/master/.doctrees/use-monitoring/index.doctree differ diff --git a/master/.nojekyll b/master/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/master/404.html b/master/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/master/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                                +

                                404

                                +

                                The ScyllaDB monster ate your page!

                                +

                                + Home +

                                +
                                + + + \ No newline at end of file diff --git a/master/CNAME b/master/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/master/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/master/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/master/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..3e85b60ab --- /dev/null +++ b/master/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,576 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" diff --git a/master/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/master/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/master/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/master/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/master/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/master/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/master/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/master/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/master/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/master/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/master/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/master/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/master/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/master/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/master/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/master/_images/1.png b/master/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/master/_images/1.png differ diff --git a/master/_images/2.png b/master/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/master/_images/2.png differ diff --git a/master/_images/3.png b/master/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/master/_images/3.png differ diff --git a/master/_images/advisor_panel.png b/master/_images/advisor_panel.png new file mode 100644 index 000000000..89b9a5950 Binary files /dev/null and b/master/_images/advisor_panel.png differ diff --git a/master/_images/after-backfilling.jpg b/master/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/master/_images/after-backfilling.jpg differ diff --git a/master/_images/alertmanager.png b/master/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/master/_images/alertmanager.png differ diff --git a/master/_images/before-backfilling.png b/master/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/master/_images/before-backfilling.png differ diff --git a/master/_images/cql_optimization_master.png b/master/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/master/_images/cql_optimization_master.png differ diff --git a/master/_images/datadog.png b/master/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/master/_images/datadog.png differ diff --git a/master/_images/grafana.png b/master/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/master/_images/grafana.png differ diff --git a/master/_images/monitor.png b/master/_images/monitor.png new file mode 100644 index 000000000..cf691ecb3 Binary files /dev/null and b/master/_images/monitor.png differ diff --git a/master/_images/monitoring_stack.png b/master/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/master/_images/monitoring_stack.png differ diff --git a/master/_images/monitoring_stack1.png b/master/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/master/_images/monitoring_stack1.png differ diff --git a/master/_sources/common/monitor-description.rst.txt b/master/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/master/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/master/_sources/index.rst.txt b/master/_sources/index.rst.txt new file mode 100644 index 000000000..3dbe94edd --- /dev/null +++ b/master/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/master/_sources/install/docker-compose.rst.txt b/master/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/master/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/master/_sources/install/index.rst.txt b/master/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/master/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/master/_sources/install/min-prod-hw.rst.txt b/master/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/master/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                                + + + + + + + + + + + +
                                # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                00
                                + +
                                + \ No newline at end of file diff --git a/master/_sources/install/monitor-without-docker.rst.txt b/master/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..02cdaef2e --- /dev/null +++ b/master/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                                `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configuration`_. + +.. _`grafana configuration`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/master/_sources/install/monitoring-stack.rst.txt b/master/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..5843f351a --- /dev/null +++ b/master/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,412 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                                `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.6 + - 2.48.1 + - 10.2.2 + * - 4.5 + - 2.47.1 + - 10.1.5 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/master/_sources/install/start-all.rst.txt b/master/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..f270d092f --- /dev/null +++ b/master/_sources/install/start-all.rst.txt @@ -0,0 +1,107 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +**--compose** This is an experimental option. When set, it initiates a two-stage process. Firstly, a ``docker-compose.yml`` file is created along with an ``.env`` file. Following this, the script executes ``docker-compose up``. Please note that having docker-compose is a prerequisite. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/master/_sources/install/thanos.rst.txt b/master/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/master/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/master/_sources/intro.rst.txt b/master/_sources/intro.rst.txt new file mode 100644 index 000000000..78481f6c3 --- /dev/null +++ b/master/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/master/_sources/procedures/alerts/alerting.rst.txt b/master/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..d196123bc --- /dev/null +++ b/master/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,114 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in files placed under `prometheus/prom_rules/`. Prometheus will load any file that ends with `yml` or `yaml`. + +Each Prometheus alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "error" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **error**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alerts severity +--------------- + +Prometheus uses the following severities from low to high: **info**, **warn**, **error**, **critical**. + +The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the **error** alert for disk-full is firing, it silences the **warn** alert. + +When adding your own alerts, you can use the severities to signal the action's importance, for example **critical** would be a pager-duty, while an **error** will be an email. + +Adding Alerts +---------------- + +Add your own alerts in a separate file with a **yml** or **yaml** extension. Making it easier during upgrade. + +Modifying Alerts +---------------- + +It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/master/_sources/procedures/alerts/index.rst.txt b/master/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/master/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/master/_sources/procedures/datadog/index.rst.txt b/master/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bcc4e9b7 --- /dev/null +++ b/master/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,68 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non Scylla Cloud users, download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Cloud users, skip this step, it's been take care for by the cloud. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/master/_sources/procedures/index.rst.txt b/master/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..76a24002a --- /dev/null +++ b/master/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/master/_sources/procedures/updating-dashboard.rst.txt b/master/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/master/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/master/_sources/reference/index.rst.txt b/master/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/master/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/master/_sources/reference/matrix.rst.txt b/master/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..c5e722bbf --- /dev/null +++ b/master/_sources/reference/matrix.rst.txt @@ -0,0 +1,160 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.6 + - 5.2, 5.4 + - 2021.1, 2022.1, 2022.2, 2023.1, 2024.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/master/_sources/reference/monitoring-apis.rst.txt b/master/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/master/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/master/_sources/troubleshooting/index.rst.txt b/master/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..fa1b25a10 --- /dev/null +++ b/master/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,16 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* You can ask questions and discuss the ScyllaDB Monitoring Stack in the `ScyllaDB community forum `_ and on the `Slack channel `_. \ No newline at end of file diff --git a/master/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/master/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/master/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/master/_sources/upgrade/index.rst.txt b/master/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/master/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                                +
                                +
                                +
                                Upgrade Scylla Open Source
                                +
                                +
                                + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                                +
                                +
                                diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/master/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/master/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..95cec1d4e --- /dev/null +++ b/master/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,150 @@ +====================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b +====================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y.b (The new version) +------------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip + unzip scylla-monitoring-4.y.b.zip + cd scylla-monitoring-scylla-monitoring-4.y.b/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the target files ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the port numbers +^^^^^^^^^^^^^^^^^^^^^^^^^ +ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent. + +Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target. + +.. caution:: + + As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics. + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x.a version that is currently running. + +Killing the new 4.y.b Monitoring stack in testing mode +------------------------------------------------------ + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y.b version while testing. + +Move to version 4.y.b (the new version) +--------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y.b Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x.a version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y.b in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y.b` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x.a +------------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y.b Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x.a/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/master/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/master/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/master/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/master/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..f86568a31 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,11 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/master/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/master/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/master/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/master/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/master/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/master/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/master/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/master/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/master/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/master/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/master/_sources/use-monitoring/advisor/index.rst.txt b/master/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..06fc98c5f --- /dev/null +++ b/master/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,37 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/master/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/master/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/master/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/master/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/master/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/master/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/master/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/master/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/master/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/master/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/master/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/master/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/master/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/master/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/master/_sources/use-monitoring/advisor/systemOverload.rst.txt b/master/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..ac0b7d62f --- /dev/null +++ b/master/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Queues are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/master/_sources/use-monitoring/cql-optimization.rst.txt b/master/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..7ac8b2284 --- /dev/null +++ b/master/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,155 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +We strongly recommend using use the correct ordering. +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is supported, but not advisable. + + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/master/_sources/use-monitoring/index.rst.txt b/master/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/master/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/master/_static/basic.css b/master/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/master/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/master/_static/check-solid.svg b/master/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/master/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/clipboard.min.js b/master/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/master/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/master/_static/copybutton.css b/master/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/master/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                                Short

                                + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/master/_static/copybutton.js b/master/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/master/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/master/_static/copybutton_funcs.js b/master/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/master/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/master/_static/css/main.css b/master/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/master/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/master/_static/doctools.js b/master/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/master/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/master/_static/documentation_options.js b/master/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/master/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/master/_static/file.png b/master/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/master/_static/file.png differ diff --git a/master/_static/img/banner-background.svg b/master/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/master/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/master/_static/img/favicon-228x228.png b/master/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/master/_static/img/favicon-228x228.png differ diff --git a/master/_static/img/favicon-32x32.png b/master/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/master/_static/img/favicon-32x32.png differ diff --git a/master/_static/img/favicon.ico b/master/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/master/_static/img/favicon.ico differ diff --git a/master/_static/img/icons/icon-about-team.svg b/master/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/master/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/master/_static/img/icons/icon-about-us-m.svg b/master/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/master/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-about-us.svg b/master/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/master/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-alternator.svg b/master/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/master/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-apps.svg b/master/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/master/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-architecture.svg b/master/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/master/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/master/_static/img/icons/icon-benchmarks.svg b/master/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/master/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/master/_static/img/icons/icon-blog.svg b/master/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/master/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/master/_static/img/icons/icon-careers.svg b/master/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/master/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/master/_static/img/icons/icon-chevron-left.svg b/master/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/master/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/icons/icon-chevron-right.svg b/master/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/master/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/icons/icon-circe.svg b/master/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/master/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-clock.svg b/master/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/master/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-close.svg b/master/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/master/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/master/_static/img/icons/icon-cloud-docs.svg b/master/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/master/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-cloud.svg b/master/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/master/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-comparison.svg b/master/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/master/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/master/_static/img/icons/icon-contact-us.svg b/master/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/master/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/master/_static/img/icons/icon-developers-blog.svg b/master/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/master/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/master/_static/img/icons/icon-docs.svg b/master/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/master/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/master/_static/img/icons/icon-enterprise-m.svg b/master/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/master/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/img/icons/icon-enterprise.svg b/master/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/master/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-events.svg b/master/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/master/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/master/_static/img/icons/icon-exclamation.svg b/master/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/master/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/master/_static/img/icons/icon-expand.svg b/master/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/master/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/master/_static/img/icons/icon-forum.svg b/master/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/master/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-getting-started.svg b/master/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/master/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-glossary.svg b/master/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/master/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-home.svg b/master/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/master/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-infoworld.svg b/master/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/master/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/master/_static/img/icons/icon-integrations.svg b/master/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/master/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-knowledge-base.svg b/master/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/master/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-less.svg b/master/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/master/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/master/_static/img/icons/icon-live-test.svg b/master/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/master/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/master/_static/img/icons/icon-mail-list.svg b/master/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/master/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-manager.svg b/master/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/master/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/master/_static/img/icons/icon-memory-management.svg b/master/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/master/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/master/_static/img/icons/icon-modeling.svg b/master/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/master/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-monitoring.svg b/master/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/master/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/master/_static/img/icons/icon-networking.svg b/master/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/master/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/master/_static/img/icons/icon-news.svg b/master/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/master/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/master/_static/img/icons/icon-newsletter.svg b/master/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/master/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/master/_static/img/icons/icon-nsql-guides.svg b/master/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/master/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/master/_static/img/icons/icon-open-source.svg b/master/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/master/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/master/_static/img/icons/icon-operator.svg b/master/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/master/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-overview.svg b/master/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/master/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/master/_static/img/icons/icon-partners.svg b/master/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/master/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/master/_static/img/icons/icon-plus.svg b/master/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/master/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/master/_static/img/icons/icon-pricing.svg b/master/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/master/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/master/_static/img/icons/icon-release-notes.svg b/master/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/master/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/master/_static/img/icons/icon-resource-center.svg b/master/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/master/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/master/_static/img/icons/icon-roadmap.svg b/master/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/master/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/master/_static/img/icons/icon-search.svg b/master/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/master/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/img/icons/icon-slack.svg b/master/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/master/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-stack-overflow.svg b/master/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/master/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/master/_static/img/icons/icon-summit.svg b/master/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/master/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/icons/icon-support.svg b/master/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/master/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/master/_static/img/icons/icon-tech-talks.svg b/master/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/master/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/master/_static/img/icons/icon-testing.svg b/master/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/master/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/master/_static/img/icons/icon-thumbs-down.svg b/master/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/master/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-thumbs-up.svg b/master/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/master/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/master/_static/img/icons/icon-tip.svg b/master/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/master/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/master/_static/img/icons/icon-training.svg b/master/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/master/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/master/_static/img/icons/icon-triangle-down.svg b/master/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/master/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/icons/icon-university.svg b/master/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/master/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/master/_static/img/icons/icon-users-blog.svg b/master/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/master/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/master/_static/img/icons/icon-warning.svg b/master/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/master/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/master/_static/img/icons/icon-webinars.svg b/master/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/master/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/master/_static/img/icons/icon-whitepapers.svg b/master/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/master/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/master/_static/img/icons/icon-workshop.svg b/master/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/master/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/master/_static/img/logo-docs.svg b/master/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/master/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/img/logo-scylla-horizontal-RGB.svg b/master/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/master/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/master/_static/img/mascots/404.jpg b/master/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/master/_static/img/mascots/404.jpg differ diff --git a/master/_static/img/mascots/scylla-3monsters.png b/master/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/master/_static/img/mascots/scylla-3monsters.png differ diff --git a/master/_static/img/mascots/scylla-advisor-crystal.png b/master/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/master/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/master/_static/img/mascots/scylla-alternator.svg b/master/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/master/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/master/_static/img/mascots/scylla-cloud.svg b/master/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/master/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/master/_static/img/mascots/scylla-computer-3-monsters.png b/master/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/master/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/master/_static/img/mascots/scylla-computer-headset.png b/master/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/master/_static/img/mascots/scylla-computer-headset.png differ diff --git a/master/_static/img/mascots/scylla-cup-number-one.png b/master/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/master/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/master/_static/img/mascots/scylla-docs.svg b/master/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/master/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/master/_static/img/mascots/scylla-drivers.svg b/master/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/master/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/master/_static/img/mascots/scylla-enterprise.svg b/master/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/master/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/master/_static/img/mascots/scylla-forklift-boxes.png b/master/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/master/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/master/_static/img/mascots/scylla-forklift-migration.png b/master/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/master/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/master/_static/img/mascots/scylla-gear.png b/master/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/master/_static/img/mascots/scylla-gear.png differ diff --git a/master/_static/img/mascots/scylla-hardhat.png b/master/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/master/_static/img/mascots/scylla-hardhat.png differ diff --git a/master/_static/img/mascots/scylla-headband.png b/master/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/master/_static/img/mascots/scylla-headband.png differ diff --git a/master/_static/img/mascots/scylla-headset.png b/master/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/master/_static/img/mascots/scylla-headset.png differ diff --git a/master/_static/img/mascots/scylla-hearts.png b/master/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/master/_static/img/mascots/scylla-hearts.png differ diff --git a/master/_static/img/mascots/scylla-looking-down.png b/master/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/master/_static/img/mascots/scylla-looking-down.png differ diff --git a/master/_static/img/mascots/scylla-looking-up.png b/master/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/master/_static/img/mascots/scylla-looking-up.png differ diff --git a/master/_static/img/mascots/scylla-magnifying-glass-fronting.png b/master/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/master/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/master/_static/img/mascots/scylla-magnifying-glass.png b/master/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/master/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/master/_static/img/mascots/scylla-manager.svg b/master/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/master/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/master/_static/img/mascots/scylla-monitor.svg b/master/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/master/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/master/_static/img/mascots/scylla-movement-fast.png b/master/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/master/_static/img/mascots/scylla-movement-fast.png differ diff --git a/master/_static/img/mascots/scylla-movement.png b/master/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/master/_static/img/mascots/scylla-movement.png differ diff --git a/master/_static/img/mascots/scylla-onpremise.png b/master/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/master/_static/img/mascots/scylla-onpremise.png differ diff --git a/master/_static/img/mascots/scylla-opensource.svg b/master/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/master/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/master/_static/img/mascots/scylla-operator.svg b/master/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/master/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/master/_static/img/mascots/scylla-plugin.png b/master/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/master/_static/img/mascots/scylla-plugin.png differ diff --git a/master/_static/img/mascots/scylla-release-mascot.png b/master/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/master/_static/img/mascots/scylla-release-mascot.png differ diff --git a/master/_static/img/mascots/scylla-repair.png b/master/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/master/_static/img/mascots/scylla-repair.png differ diff --git a/master/_static/img/mascots/scylla-server.png b/master/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/master/_static/img/mascots/scylla-server.png differ diff --git a/master/_static/img/mascots/scylla-sleeping.png b/master/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/master/_static/img/mascots/scylla-sleeping.png differ diff --git a/master/_static/img/mascots/scylla-tall-measure.png b/master/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/master/_static/img/mascots/scylla-tall-measure.png differ diff --git a/master/_static/img/mascots/scylla-university.png b/master/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/master/_static/img/mascots/scylla-university.png differ diff --git a/master/_static/img/mascots/scylla-weights.png b/master/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/master/_static/img/mascots/scylla-weights.png differ diff --git a/master/_static/img/mascots/scylla-window-cleaning.png b/master/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/master/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/master/_static/img/mascots/scylla-with-computer-2.png b/master/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/master/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/master/_static/img/mascots/scylla-with-computer.png b/master/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/master/_static/img/mascots/scylla-with-computer.png differ diff --git a/master/_static/img/mascots/scylla-with-linux.png b/master/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/master/_static/img/mascots/scylla-with-linux.png differ diff --git a/master/_static/img/mascots/scylla-writting.png b/master/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/master/_static/img/mascots/scylla-writting.png differ diff --git a/master/_static/img/menu.svg b/master/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/master/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/master/_static/img/scylla-monitor.png b/master/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/master/_static/img/scylla-monitor.png differ diff --git a/master/_static/js/main.bundle.js b/master/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/master/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                              • Back
                              • ',backButtonPosition:"top",wrapper:"
                                ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                                  "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                                  ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                                  ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                                  ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                                  ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                                  "],col:[2,"","
                                  "],tr:[2,"","
                                  "],td:[3,"","
                                  "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +

                                  ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                  + + +
                                  + + + + + +
                                  + + +
                                  + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/genindex.html b/master/genindex.html new file mode 100644 index 000000000..64c9131cd --- /dev/null +++ b/master/genindex.html @@ -0,0 +1,641 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + + + +
                                  + + + + + +
                                  + + +
                                  + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/index.html b/master/index.html new file mode 100644 index 000000000..d6b6abe2f --- /dev/null +++ b/master/index.html @@ -0,0 +1,671 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  ScyllaDB Monitoring Stack

                                  +
                                  +
                                  +

                                  ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                  +_images/monitor.png +

                                  The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                                  +
                                    +
                                  • prometheus - collects and stores metrics

                                  • +
                                  • alertmanager - handles alerts

                                  • +
                                  • grafana - dashboard server

                                  • +
                                  +

                                  Choose a topic to get started:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/install/docker-compose.html b/master/install/docker-compose.html new file mode 100644 index 000000000..9d3d016a6 --- /dev/null +++ b/master/install/docker-compose.html @@ -0,0 +1,813 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Using Docker Compose

                                  +

                                  Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                                  +

                                  Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                                  +
                                  +

                                  Warning

                                  +

                                  docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                                  +
                                  +
                                  +

                                  Prerequisite

                                  +

                                  Make sure you have docker and docker-compose installed.

                                  +
                                  +
                                  +

                                  Setting Prometheus

                                  +

                                  The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                                  +

                                  You can use ./prometheus-config.sh to generate the file, for example:

                                  +
                                  ./prometheus-config.sh --compose
                                  +
                                  +
                                  +

                                  For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                                  +
                                  +
                                  +

                                  Setting Grafana Provisioning

                                  +

                                  Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                                  +
                                  +

                                  Grafana Data-Source file

                                  +

                                  Run the following command to update the datasource:

                                  +
                                  ./grafana-datasource.sh --compose
                                  +
                                  +
                                  +

                                  You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                                  +
                                  +
                                  +

                                  Grafana Dashboard Load file

                                  +

                                  To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                                  +
                                  ./generate-dashboards.sh -t -v 2020.1
                                  +
                                  +
                                  +

                                  This command generates the files under: grafana/provisioning/dashboards/

                                  +
                                  +
                                  +
                                  +

                                  Docker Compose file

                                  +

                                  You can use the following example as a base for your docker compose.

                                  +

                                  Pass the following to a file called docker-compose.yml

                                  +
                                  services:
                                  +  alertmanager:
                                  +    container_name: aalert
                                  +    image: prom/alertmanager:v0.24.0
                                  +    ports:
                                  +    - 9093:9093
                                  +    volumes:
                                  +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                                  +  grafana:
                                  +    container_name: agraf
                                  +    environment:
                                  +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                                  +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                                  +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                                  +    # This is where you set Grafana security
                                  +    - GF_AUTH_BASIC_ENABLED=false
                                  +    - GF_AUTH_ANONYMOUS_ENABLED=true
                                  +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                                  +    - GF_SECURITY_ADMIN_PASSWORD=admin
                                  +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                                  +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                                  +    image: grafana/grafana:9.3.11
                                  +    ports:
                                  +    - 3000:3000
                                  +    user: 1000:1000
                                  +    volumes:
                                  +    - ./grafana/build:/var/lib/grafana/dashboards
                                  +    - ./grafana/plugins:/var/lib/grafana/plugins
                                  +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                                  +    # Uncomment the following line for grafana persistency
                                  +    # - path/to/grafana/dir:/var/lib/grafana
                                  +  loki:
                                  +    command:
                                  +    - --config.file=/mnt/config/loki-config.yaml
                                  +    container_name: loki
                                  +    image: grafana/loki:2.7.3
                                  +    ports:
                                  +    - 3100:3100
                                  +    volumes:
                                  +    - ./loki/rules:/etc/loki/rules
                                  +    - ./loki/conf:/mnt/config
                                  +  promotheus:
                                  +    command:
                                  +    - --config.file=/etc/prometheus/prometheus.yml
                                  +    container_name: aprom
                                  +    image: prom/prometheus:v2.42.0
                                  +    ports:
                                  +    - 9090:9090
                                  +    volumes:
                                  +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                                  +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                                  +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                                  +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                                  +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                                  +    # Uncomment the following line for prometheus persistency 
                                  +    # - path/to/data/dir:/prometheus/data
                                  +  promtail:
                                  +    command:
                                  +    - --config.file=/etc/promtail/config.yml
                                  +    container_name: promtail
                                  +    image: grafana/promtail:2.7.3
                                  +    ports:
                                  +    - 1514:1514
                                  +    - 9080:9080
                                  +    volumes:
                                  +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                                  +version: '3'
                                  +
                                  +
                                  +
                                  +

                                  Start and Stop

                                  +

                                  To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/install/index.html b/master/install/index.html new file mode 100644 index 000000000..c31b29fff --- /dev/null +++ b/master/install/index.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Download and Install Scylla Monitoring Stack

                                  +
                                  +
                                  +

                                  Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                                  +

                                  Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/install/min-prod-hw.html b/master/install/min-prod-hw.html new file mode 100644 index 000000000..28575fd86 --- /dev/null +++ b/master/install/min-prod-hw.html @@ -0,0 +1,740 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Minimal Production System Recommendations

                                  +
                                    +
                                  • CPU - at least 2 physical cores/ 4vCPUs

                                  • +
                                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                                  • +
                                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                  • +
                                  • Network - 1GbE/10GbE preferred

                                  • +
                                  +
                                  +

                                  Calculating Prometheus Minimal Disk Space requirement

                                  +

                                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                  +

                                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                  +

                                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                  +
                                  6 * 16 * 15 * 12MB ~ 16GB
                                  +
                                  +
                                  +

                                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                  +
                                  +
                                  +

                                  Calculating Prometheus Minimal Memory Space requirement

                                  +

                                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                  +

                                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                  + +
                                  + +++++++ + + + +
                                  # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                  00
                                  + +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/install/monitor-without-docker.html b/master/install/monitor-without-docker.html new file mode 100644 index 000000000..641a9b200 --- /dev/null +++ b/master/install/monitor-without-docker.html @@ -0,0 +1,1156 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Deploying Scylla Monitoring Stack Without Docker

                                  +
                                  +

                                  Introduction

                                  +

                                  The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                                  +

                                  Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                                  +

                                  Scylla Monitoring uses the following components:

                                  +
                                    +
                                  • Alertmanager

                                  • +
                                  • Grafana Loki

                                  • +
                                  • Prometheus

                                  • +
                                  • Grafana

                                  • +
                                  +

                                  The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components.

                                  +

                                  We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                                  +
                                  +
                                  +

                                  Minimal Production System Recommendations

                                  +
                                    +
                                  • CPU - at least 2 physical cores/ 4vCPUs

                                  • +
                                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                                  • +
                                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                  • +
                                  • Network - 1GbE/10GbE preferred

                                  • +
                                  +
                                  +

                                  Calculating Prometheus Minimal Disk Space requirement

                                  +

                                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                  +

                                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                  +

                                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                  +
                                  6 * 16 * 15 * 12MB ~ 16GB
                                  +
                                  +
                                  +

                                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                  +
                                  +
                                  +

                                  Calculating Prometheus Minimal Memory Space requirement

                                  +

                                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                  +

                                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                  + +
                                  + +++++++ + + + +
                                  # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                  00
                                  + +
                                  +

                                  The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                                  +
                                  +

                                  Note

                                  +

                                  Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Install Scylla Monitoring Stack

                                  +

                                  The following procedure uses a CentOS 7 based instance

                                  +
                                    +
                                  1. Download the latest Scylla Monitoring Stack release.

                                  2. +
                                  +
                                  wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.0.0.tar.gz
                                  +
                                  +
                                  +
                                    +
                                  1. Open the tar

                                  2. +
                                  +

                                  tar -xvf scylla-monitoring-*.tar.gz

                                  +
                                  +
                                  +

                                  Install Alertmanager

                                  +

                                  Tested with alertmanager 0.22.2 version

                                  +
                                    +
                                  1. Install alertmanager

                                  2. +
                                  +
                                  wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                                  +tar -xvf alertmanager-*.linux-amd64.tar.gz
                                  +
                                  +
                                  +
                                    +
                                  1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                                  2. +
                                  +

                                  For example:

                                  +
                                  cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.0.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                                  +
                                  +
                                  +
                                    +
                                  1. Start the Alertmanager

                                  2. +
                                  +

                                  For example:

                                  +
                                  cd alertmanager-0.22.2.linux-amd64
                                  +./alertmanager
                                  +
                                  +
                                  +
                                    +
                                  1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                                  2. +
                                  +

                                  For example:

                                  +
                                  http://192.168.135.166:9093/
                                  +
                                  +
                                  +../_images/alertmanager.png +
                                  +
                                  +

                                  Install Grafana Loki

                                  +

                                  Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                                  +

                                  We recomand using Loki with containers, but you can install it locally as described in Loki installation

                                  +

                                  You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                                  +

                                  Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                                  +

                                  Loki Related files

                                  +

                                  Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                                  +
                                  mkdir -p /etc/loki/rules
                                  +mkdir -p /etc/loki/config
                                  +cp loki/rules/* /etc/loki/rules
                                  +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                                  +
                                  +
                                  +

                                  Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                                  +

                                  Promtail Related files

                                  +

                                  Promtail has a configuration file. You need to copy and modify the configuration.

                                  +
                                  mkdir -p /etc/promtail/
                                  +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                                  +
                                  +
                                  +

                                  Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                                  +
                                  +
                                  +

                                  Install Prometheus

                                  +

                                  Tested with Prometheus version 2.27.1

                                  +
                                  +

                                  Note

                                  +

                                  If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                                  +
                                  +
                                    +
                                  1. Install Prometheus

                                  2. +
                                  +
                                  wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                                  +tar -xvf prometheus-*.linux-amd64.tar.gz
                                  +
                                  +
                                  +

                                  2. Create Data and Config directories +.. code-block:: shell

                                  +
                                  +

                                  mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                                  +
                                  +
                                    +
                                  1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                                  2. +
                                  +

                                  Copy prometheus/prometheus.yml.template to prometheus.yml

                                  +

                                  For example:

                                  +
                                  cp scylla-monitoring-scylla-monitoring-4.0.0/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                                  +cp scylla-monitoring-scylla-monitoring-4.0.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                                  +
                                  +
                                  +
                                    +
                                  1. Edit the prometheus.yml file to point to the correct static data sources.

                                  2. +
                                  +
                                  +

                                  Note

                                  +

                                  Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                                  +
                                  +
                                  vi /etc/prometheus/prometheus.yml
                                  +
                                  +
                                  +

                                  Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                                  +

                                  For example if the alertmanager will run on the same host:

                                  +
                                  alerting:
                                  +   alertmanagers:
                                  +   - static_configs:
                                  +       - targets:
                                  +           - 127.0.0.1:9093
                                  +
                                  +
                                  +

                                  Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                                  +

                                  For example the scrape config for Scylla:

                                  +
                                  global:
                                  +  scrape_interval: 5s # By default, scrape targets every 5 second.
                                  +  scrape_timeout: 4s # Timeout before trying to scape a target again
                                  +
                                  +  # Attach these labels to any time series or alerts when communicating with
                                  +  # external systems (federation, remote storage, Alertmanager).
                                  +  external_labels:
                                  +    monitor: 'scylla-monitor'
                                  +
                                  +scrape_configs:
                                  +- job_name: scylla
                                  +  honor_labels: false
                                  +  file_sd_configs:
                                  +    - files:
                                  +      - /etc/scylla.d/prometheus/scylla_servers.yml
                                  +  relabel_configs:
                                  +    - source_labels: [__address__]
                                  +      regex:  '([^:]+)'
                                  +      target_label: __address__
                                  +      replacement: '${1}:9180'
                                  +
                                  +    - source_labels: [__address__]
                                  +      regex:  '(.*):.+'
                                  +      target_label: instance
                                  +      replacement: '${1}'
                                  +
                                  +
                                  +
                                    +
                                  1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                                  2. +
                                  +
                                  +

                                  Note

                                  +

                                  There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                                  +
                                  +

                                  An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                                  +
                                  +

                                  Note

                                  +

                                  You must have both files even if you are not using Scylla Manager

                                  +
                                  +

                                  Add the labels for the cluster and data-center

                                  +

                                  scylla_servers.yml:

                                  +

                                  For example:

                                  +
                                  cat scylla_servers.yml
                                  +# List Scylla end points
                                  +
                                  +- targets:
                                  +  - 192.168.66.6
                                  +  - 192.168.66.244
                                  +  labels:
                                  +    cluster: cluster1
                                  +    dc: dc1
                                  +- targets:
                                  +    - 172.17.0.3
                                  +  labels:
                                  +    cluster: cluster1
                                  +    dc: dc2
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  See the previous note about deprecating the node_exporter_servers.yml file.

                                  +
                                  +

                                  scylla_manager_server.yml

                                  +

                                  For example:

                                  +
                                  - targets:
                                  +  - 127.0.0.1:5090
                                  +
                                  +
                                  +
                                    +
                                  1. Start Prometheus server:

                                  2. +
                                  +

                                  For example:

                                  +
                                  cd scylla-monitoring-scylla-monitoring-4.0.0/
                                  +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                                  +
                                  +
                                  +

                                  Data should start accumulate on: /prometheus/data

                                  +
                                    +
                                  1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                                  2. +
                                  +

                                  For example:

                                  +
                                  http://192.168.135.166:9090/
                                  +
                                  +
                                  +../_images/1.png +

                                  Prometheus console should be visible

                                  +
                                    +
                                  1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                                  2. +
                                  +

                                  For example:

                                  +

                                  node_memory_MemFree

                                  +../_images/2.png +

                                  And

                                  +

                                  scylla_reactor_utilization

                                  +../_images/3.png +

                                  At this point Scylla is emitting the metrics and Prometheus is able to store them.

                                  +
                                  +
                                  +

                                  Install Grafana

                                  +

                                  Tested with Grafna 7.5.7

                                  +
                                    +
                                  1. Install Grafana based on the instructions here

                                  2. +
                                  +

                                  Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                                  +
                                    +
                                  1. Access Scylla-Grafana-monitoring directory

                                  2. +
                                  +
                                  cd scylla-monitoring-scylla-monitoring-4.0.0/
                                  +
                                  +
                                  +
                                    +
                                  1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                                  2. +
                                  +
                                  sudo cp -r grafana/plugins /var/lib/grafana/
                                  +
                                  +
                                  +

                                  If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                                  +

                                  For example:

                                  +
                                  cp -r grafana/plugins ../grafana-7.5.7/public/app
                                  +
                                  +
                                  +
                                    +
                                  1. Provision the Dashboards

                                  2. +
                                  +

                                  For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                                  +

                                  For Grafana installed with yum install

                                  +
                                  sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                                  +sudo mkdir -p /var/lib/grafana/dashboards
                                  +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                                  +
                                  +
                                  +

                                  For Grafana installed from packages

                                  +
                                  cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                                  +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                                  +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                                  +
                                  +
                                  +

                                  Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                                  +
                                  +

                                  Note

                                  +

                                  A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                                  +
                                  +
                                    +
                                  1. Set the data source by copy datasource.yml and edit it

                                  2. +
                                  +
                                  sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  Scylla uses a plugin to read from some system tables see the section below about using it.

                                  +
                                  +

                                  For Grafana installed from packages

                                  +
                                  cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                                  +
                                  +
                                  +

                                  You should set the Prometheus and the alertmanager IP and port.

                                  +

                                  For example

                                  +
                                  sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                                  +apiVersion: 1
                                  +datasources:
                                  + - name: prometheus
                                  +   type: prometheus
                                  +   url: http://192.168.135.167:9090
                                  +   access: proxy
                                  +   basicAuth: false
                                  +
                                  + - name: alertmanager
                                  +   type: camptocamp-prometheus-alertmanager-datasource
                                  +   orgId: 1
                                  +   typeLogoUrl: public/img/icn-datasource.svg
                                  +   access: proxy
                                  +   url: http://192.168.135.166:9093
                                  +   password:
                                  +   user:
                                  +   database:
                                  +   basicAuth:
                                  +   isDefault:
                                  +   jsonData:
                                  +     severity_critical: '4'
                                  +     severity_high: '3'
                                  +     severity_warning: '2'
                                  +     severity_info: '1'
                                  +
                                  +
                                  +
                                    +
                                  1. Start the Grafana service

                                  2. +
                                  +

                                  For Grafana installed with yum install

                                  +

                                  sudo service grafana-server start

                                  +

                                  For Grafana installed from packages:

                                  +

                                  cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                                  +

                                  Edit scylla.ini to reflect the right paths in the paths section of the file.

                                  +
                                  plugins = /home/centos/grafana-7.5.7/data/plugins
                                  +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                                  +
                                  +
                                  +

                                  Start the server:

                                  +
                                  cd /home/centos/grafana-7.5.7/
                                  +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                                  +
                                  +
                                  +
                                    +
                                  1. Make sure Grafana is running

                                  2. +
                                  +

                                  Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                                  +../_images/grafana.png +
                                  +
                                  +

                                  Using Scylla Plugin with Grafana

                                  +

                                  Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                                  +

                                  Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                                  +
                                  +

                                  Setting a monitoring user

                                  +

                                  This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                                  +
                                    +
                                  • If you have not done so, enable authorization first.

                                  • +
                                  • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                                  • +
                                  • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                                  • +
                                  +
                                  +
                                  +

                                  Installing the Plugin

                                  +

                                  Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                                  +
                                  +
                                  +

                                  Configure the Plugin

                                  +

                                  Add an entry to the datasource.yml file

                                  +
                                  - name: scylla-datasource
                                  +  type: scylladb-scylla-datasource
                                  +  orgId: 1
                                  +  isDefault:
                                  +  jsonData:
                                  +  host: ''
                                  +#  secureJsonData:
                                  +#    user: 'scylla_monitoring'
                                  +#    password: 'scylla_monitoring'
                                  +
                                  +
                                  +

                                  As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                                  +
                                  +
                                  +

                                  Enable the Plugin

                                  +

                                  Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                                  +

                                  See more about it the Grafana configuration.

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/install/monitoring-stack.html b/master/install/monitoring-stack.html new file mode 100644 index 000000000..9d81d9ea4 --- /dev/null +++ b/master/install/monitoring-stack.html @@ -0,0 +1,1103 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Install Scylla Monitoring Stack

                                  +

                                  This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                                  +

                                  The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                                  +

                                  For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                                  +
                                  +

                                  Minimal Production System Recommendations

                                  +
                                    +
                                  • CPU - at least 2 physical cores/ 4vCPUs

                                  • +
                                  • Memory - 15GB+ DRAM and proportional to the number of cores.

                                  • +
                                  • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                  • +
                                  • Network - 1GbE/10GbE preferred

                                  • +
                                  +
                                  +

                                  Calculating Prometheus Minimal Disk Space requirement

                                  +

                                  Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                  +

                                  Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                  +

                                  For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                  +
                                  6 * 16 * 15 * 12MB ~ 16GB
                                  +
                                  +
                                  +

                                  To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                  +
                                  +
                                  +

                                  Calculating Prometheus Minimal Memory Space requirement

                                  +

                                  Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                  +

                                  For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                  + +
                                  + +++++++ + + + +
                                  # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                  00
                                  + +
                                  +
                                  +
                                  +
                                  +

                                  Prerequisites

                                  +
                                    +
                                  • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                                  • +
                                  • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                                  • +
                                  + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  Scylla Monitoring Stack Compatibility Matrix

                                  Scylla Monitoring Stack Version

                                  Prometheus Version

                                  Grafana Version

                                  4.6

                                  2.48.1

                                  10.2.2

                                  4.5

                                  2.47.1

                                  10.1.5

                                  4.4

                                  2.44.0

                                  9.5.2

                                  4.3

                                  2.42.0

                                  9.3.8

                                  4.2

                                  2.41.0

                                  9.3.4

                                  4.1

                                  2.38.0

                                  9.1.0

                                  4.0

                                  2.34.0

                                  8.5.2

                                  3.11

                                  2.32.0

                                  8.3.4

                                  3.10

                                  2.32.0

                                  8.3.3

                                  3.9.2

                                  2.29.1

                                  8.2.7

                                  3.9

                                  2.29.1

                                  8.1.1

                                  3.8

                                  2.27.1

                                  7.5.7

                                  3.7

                                  2.25.2

                                  7.4.0

                                  3.6

                                  2.18.1

                                  7.3.5

                                  3.5

                                  2.18.1

                                  7.1.5

                                  3.4

                                  2.18.1

                                  6.7.3

                                  +
                                  +
                                  +

                                  Docker Post Installation

                                  +

                                  Docker post installation guide can be found here

                                  +
                                  +

                                  Note

                                  +

                                  Avoid running the container as root.

                                  +
                                  +

                                  To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                                  +
                                    +
                                  1. Create the Docker group.

                                  2. +
                                  +
                                  sudo groupadd docker
                                  +
                                  +
                                  +
                                    +
                                  1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                                  2. +
                                  +
                                  sudo usermod -aG docker $USER
                                  +
                                  +
                                  +
                                    +
                                  1. Start Docker by calling:

                                  2. +
                                  +
                                  sudo systemctl enable docker
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Install Scylla Monitoring Stack

                                  +

                                  Procedure

                                  +
                                    +
                                  1. Download and extract the latest Scylla Monitoring Stack binary;.

                                  2. +
                                  +
                                  wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.0.0.tar.gz
                                  +tar -xvf scylla-monitoring-4.0.0.tar.gz
                                  +cd scylla-monitoring-scylla-monitoring-4.0.0
                                  +
                                  +
                                  +

                                  As an alternative, you can clone and use the Git repository directly.

                                  +
                                  git clone https://github.com/scylladb/scylla-monitoring.git
                                  +cd scylla-monitoring
                                  +git checkout branch-4.0
                                  +
                                  +
                                  +
                                    +
                                  1. Start Docker service if needed

                                  2. +
                                  +
                                  sudo systemctl restart docker
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Configure Scylla Monitoring Stack

                                  +

                                  To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                                  +

                                  This configuration can be done from files, or using the Consul api.

                                  +

                                  Scylla Manager 2.0 and higher supports the Consul API.

                                  +
                                  +

                                  Configure Scylla nodes from files

                                  +
                                    +
                                  1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                                  2. +
                                  +
                                  +

                                  Note

                                  +

                                  It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                                  +
                                  +

                                  For example:

                                  +
                                  - targets:
                                  +      - 172.17.0.2
                                  +      - 172.17.0.3
                                  +  labels:
                                  +      cluster: cluster1
                                  +      dc: dc1
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                                  +
                                  +

                                  Using IPV6

                                  +

                                  To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets.

                                  +

                                  For example:

                                  +
                                  - targets:
                                  +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]"
                                  +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]"
                                  +  labels:
                                  +      cluster: cluster1
                                  +      dc: dc1
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                                  +
                                  +

                                  For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                                  +
                                  +

                                  Note

                                  +

                                  By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                                  +
                                  +

                                  If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                                  +

                                  For example:

                                  +
                                  ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                                  +
                                  +
                                  +

                                  Mark the different Data Centers with Labels.

                                  +

                                  As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                                  +

                                  You can use the genconfig.py script to generate the server file. For example:

                                  +
                                  ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                                  +
                                  +
                                  +

                                  This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                                  +

                                  OR

                                  +

                                  The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                                  +
                                  nodetool status | ./genconfig.py -NS
                                  +
                                  +
                                  +

                                  2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                                  +

                                  You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                                  +

                                  For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                                  +
                                  # List Scylla Manager end points
                                  +
                                  +- targets:
                                  +  - 172.17.0.7:5090
                                  +
                                  +
                                  +

                                  Note that you do not need to add labels to the Scylla Manager targets.

                                  +
                                  +
                                  +

                                  Configure Scylla nodes using Scylla-Manager Consul API

                                  +

                                  Scylla Manager 2.0 has a Consul like API.

                                  +

                                  When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                                  +

                                  For example:

                                  +
                                  ./start-all.sh -L 10.10.0.1
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                                  +
                                  +
                                  +
                                  +

                                  Connecting Scylla-Monitoring to ScyllaDB

                                  +

                                  Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                                  +

                                  You can limit the user to read only, currently it only read table from the system keyspace.

                                  +

                                  You can set a user and password from a file or environment variables.

                                  +

                                  If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                                  +

                                  To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                                  +
                                  +

                                  Note

                                  +

                                  It is best to use a dedicated user and password with limited privileges.

                                  +
                                  +
                                  +
                                  +

                                  Use an external directory for the Prometheus data directory

                                  +

                                  The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                                  +
                                  +

                                  Note

                                  +

                                  Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                                  +
                                  +

                                  If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                                  +

                                  In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                                  +
                                  +
                                  +

                                  Add Additional Prometheus Targets

                                  +

                                  There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                                  +

                                  The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                                  +

                                  You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                                  +
                                  - job_name: 'myservice'
                                  +  # Override the global default and scrape targets from this job every 5 seconds.
                                  +  scrape_interval: 5s
                                  +  static_configs:
                                  +    - targets:
                                  +      - 17.0.0.1:7000
                                  +
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Start and Stop Scylla Monitoring Stack

                                  +
                                  +

                                  Start

                                  +
                                  ./start-all.sh -d prometheus_data
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Stop

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Start a Specific Scylla Monitoring Stack Version

                                  +

                                  By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                                  +

                                  You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                                  +

                                  Multiple versions are supported. For example:

                                  +
                                  ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                                  +
                                  +
                                  +

                                  will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                                  +
                                  +
                                  +

                                  Accessing the localhost

                                  +

                                  The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                                  +
                                  ./start-all.sh -l -d prometheus-data
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Configure rsyslog on each Scylla node

                                  +

                                  generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                                  +

                                  Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                                  +

                                  Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                                  +

                                  If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                                  +
                                  if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                                  +
                                  +
                                  +

                                  Restart rsyslog for the configuration to take effect.

                                  +
                                  systemctl restart rsyslog
                                  +
                                  +
                                  +
                                  +
                                  +
                                  +

                                  View Grafana Dashboards

                                  +

                                  Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/install/start-all.html b/master/install/start-all.html new file mode 100644 index 000000000..bb19ffbcb --- /dev/null +++ b/master/install/start-all.html @@ -0,0 +1,755 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  The start-all.sh Command

                                  +

                                  Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                                  +

                                  The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                                  +
                                  +

                                  General Options

                                  +

                                  -h Help, Print the help, and exit.

                                  +

                                  –version print the current Scylla-Monitoring stack version, and exit.

                                  +

                                  -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                                  +

                                  -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                                  +

                                  -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                                  +

                                  –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                                  +

                                  –compose This is an experimental option. When set, it initiates a two-stage process. Firstly, a docker-compose.yml file is created along with an .env file. Following this, the script executes docker-compose up. Please note that having docker-compose is a prerequisite.

                                  +
                                  + + +
                                  +

                                  Alert Manager

                                  +

                                  The Alertmanager handles the alerts and takes the following parameters:

                                  +

                                  -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                                  +

                                  -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                                  +

                                  -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/install/thanos.html b/master/install/thanos.html new file mode 100644 index 000000000..6bbd9f8ec --- /dev/null +++ b/master/install/thanos.html @@ -0,0 +1,754 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Using Thanos as Data Source With Scylla Monitoring Stack

                                  +

                                  Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                                  +
                                    +
                                  • High-availability.

                                  • +
                                  • Horizontal scaling.

                                  • +
                                  • Backup.

                                  • +
                                  +

                                  The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                                  +

                                  The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                                  +
                                  +

                                  Using Thanos As a Prometheus Aggregator

                                  +

                                  There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                                  +
                                  +

                                  Prometheus Configuration

                                  +

                                  We will assume you have two Prometheus servers running.

                                  +
                                    +
                                  1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                                  2. +
                                  3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                                  4. +
                                  +
                                  +
                                  +

                                  Thanos sidecar

                                  +

                                  The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                                  +
                                  docker run -d \
                                  + -v /path/to/prom/dir:/data/prom:z \
                                  + -i --name sidecar thanosio/thanos \
                                  + sidecar \
                                  + --grpc-address=0.0.0.0:10911 \
                                  + --grpc-grace-period=1s \
                                  + --http-address=0.0.0.0:10912 \
                                  + --http-grace-period=1s \
                                  + --prometheus.url=http://prometheus-ip:9090 \
                                  + --tsdb.path=/data/prom \
                                  + -p 10912:10912 \
                                  + -p 10911:10911
                                  +
                                  +
                                  +

                                  After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                                  +
                                  +
                                  +

                                  Thanos query

                                  +

                                  Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                                  +
                                  docker run -d \
                                  + --name thanos -- thanosio/thanos \
                                  +   query \
                                  +   --debug.name=query0 \
                                  +   --log.level=debug \
                                  +   --grpc-address=0.0.0.0:10903 \
                                  +   --grpc-grace-period=1s \
                                  +   --http-address=0.0.0.0:10904 \
                                  +   --http-grace-period=1s \
                                  +   --query.replica-label=prometheus \
                                  +   --store={ip1}:10911 --store={ip2}:10911
                                  +
                                  +
                                  +

                                  After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                                  +
                                  +
                                  +

                                  Update Scylla Data source

                                  +

                                  The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                                  +

                                  The file you edit is a template file that replaces the file Grafana uses, next time you start.

                                  +

                                  Restart the Scylla Monitoring Stack it should now use Thanos.

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/intro.html b/master/intro.html new file mode 100644 index 000000000..6c088becd --- /dev/null +++ b/master/intro.html @@ -0,0 +1,703 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  ScyllaDB Monitoring Stack

                                  +

                                  ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                  +_images/monitor.png +

                                  The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                                  +
                                    +
                                  • prometheus - Collects and stores metrics

                                  • +
                                  • grafan-loki - Parses logs and generates metrics and alerts

                                  • +
                                  • alertmanager - Handles alerts

                                  • +
                                  • grafana - Dashboards server

                                  • +
                                  +

                                  A few optional components are used for additional services

                                  +
                                    +
                                  • grafana-image-renderer - Allows you to download a dashboard as an image.

                                  • +
                                  • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                                  • +
                                  +
                                  +

                                  High Level Architecture

                                  +_images/monitoring_stack1.png +

                                  We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                                  +

                                  We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                                  +

                                  The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                                  +

                                  We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                                  +

                                  Choose a topic to get started:

                                  + +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/objects.inv b/master/objects.inv new file mode 100644 index 000000000..7f8272894 Binary files /dev/null and b/master/objects.inv differ diff --git a/master/procedures/alerts/alerting.html b/master/procedures/alerts/alerting.html new file mode 100644 index 000000000..6682477da --- /dev/null +++ b/master/procedures/alerts/alerting.html @@ -0,0 +1,772 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Alerting

                                  +

                                  Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                                  +

                                  You can read more about Prometheus alerting here

                                  +

                                  By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                                  +

                                  In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                                  +

                                  The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                                  +../../_images/monitoring_stack.png +
                                  +

                                  Prometheus Alerts

                                  +

                                  The Prometheus alerts are defined in files placed under prometheus/prom_rules/. Prometheus will load any file that ends with yml or yaml.

                                  +

                                  Each Prometheus alert consists of:

                                  +
                                    +
                                  • Name

                                  • +
                                  • What happened

                                  • +
                                  • For how long

                                  • +
                                  • What to report

                                  • +
                                  +

                                  For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                                  +
                                  - alert: InstanceDown
                                  +  expr: up == 0
                                  +  for: 60s
                                  +  labels:
                                  +    severity: "error"
                                  +  annotations:
                                  +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                                  +    summary: Instance {{ $labels.instance }} down
                                  +
                                  +
                                  +

                                  The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                                  +

                                  The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                                  +

                                  The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to error.

                                  +

                                  annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                                  +
                                  +

                                  Alerts severity

                                  +

                                  Prometheus uses the following severities from low to high: info, warn, error, critical.

                                  +

                                  The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the error alert for disk-full is firing, it silences the warn alert.

                                  +

                                  When adding your own alerts, you can use the severities to signal the action’s importance, for example critical would be a pager-duty, while an error will be an email.

                                  +
                                  +
                                  +

                                  Adding Alerts

                                  +

                                  Add your own alerts in a separate file with a yml or yaml extension. Making it easier during upgrade.

                                  +
                                  +
                                  +

                                  Modifying Alerts

                                  +

                                  It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade.

                                  +
                                  +
                                  +
                                  +

                                  Alertmanager

                                  +

                                  The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                                  +

                                  The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                                  +
                                    +
                                  • Routes: Represent a routing tree, the most specific rule, wins

                                  • +
                                  • Inhibition: Mute an alert, based on another alert

                                  • +
                                  • Receiver: Send a notification via email, sluck, etc’

                                  • +
                                  +

                                  Check the Alertmanager documentation for details on how to specify a specific receiver.

                                  +

                                  In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                                  +
                                  +
                                  +

                                  Tips When Adding an Alert

                                  +

                                  It’s worse having an alert that does not work, than not having an alert at all

                                  +

                                  There are multiple ways you can use to make sure your alert is set correctly:

                                  +
                                    +
                                  • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                                  • +
                                  • Force the alert to be active by reducing the limits or the duration.

                                  • +
                                  • When possible simulate the actual scenario and see that the alert works as expected.

                                  • +
                                  +

                                  For example, low available disk space.

                                  +

                                  Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                                  +

                                  Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                                  +

                                  Starting with a simple working expression helps you bisect problems.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/procedures/alerts/index.html b/master/procedures/alerts/index.html new file mode 100644 index 000000000..8a5ffe090 --- /dev/null +++ b/master/procedures/alerts/index.html @@ -0,0 +1,672 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Alert Manager

                                  +
                                  +
                                  +

                                  Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/procedures/datadog/index.html b/master/procedures/datadog/index.html new file mode 100644 index 000000000..33e3f9cff --- /dev/null +++ b/master/procedures/datadog/index.html @@ -0,0 +1,747 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Datadog Integration

                                  +

                                  The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                                  +
                                    +
                                  1. Installing and configuring the Datadog Agent.

                                  2. +
                                  3. Add Datadog recording rules.

                                  4. +
                                  5. Loading Scylla dashboard to Datadog.

                                  6. +
                                  7. Optionally load Monitor (Alerts).

                                  8. +
                                  +
                                  +

                                  Note

                                  +

                                  Scylla Cloud users, use and update the proper configuration file.

                                  +
                                  +
                                  +

                                  Install And configure the Datadog Agent

                                  +

                                  Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                                  +

                                  Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                  +
                                  +

                                  Scylla Cloud Users

                                  +

                                  Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                  +

                                  Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                                  +
                                  +
                                  +

                                  Other Scylla Users

                                  +

                                  Other Scylla users, download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                                  +
                                  +
                                  +

                                  Post configuration

                                  +

                                  Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                                  +
                                  +

                                  Note

                                  +

                                  By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Add datadog recording rules

                                  +

                                  Non Scylla Cloud users, download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                                  +

                                  Cloud users, skip this step, it’s been take care for by the cloud.

                                  +
                                  +
                                  +

                                  Upload the Dashboard

                                  +

                                  Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                  +
                                  +
                                  +

                                  Using the Dashboard

                                  +

                                  We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                                  +../../_images/datadog.png +

                                  The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                  +
                                  +

                                  Note

                                  +

                                  Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                  +
                                  +
                                  +
                                  +

                                  Adding Monitor

                                  +

                                  Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/procedures/index.html b/master/procedures/index.html new file mode 100644 index 000000000..3eede65a3 --- /dev/null +++ b/master/procedures/index.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  ScyllaDB Monitoring Stack Procedures

                                  +
                                  +
                                  +

                                  There are several reference guides available which give additional information. Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/procedures/updating-dashboard.html b/master/procedures/updating-dashboard.html new file mode 100644 index 000000000..d3b65a2e4 --- /dev/null +++ b/master/procedures/updating-dashboard.html @@ -0,0 +1,959 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Adding and Modifying Dashboards

                                  +

                                  This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                                  +

                                  It covers dashboard templates and how to modify them.

                                  + +
                                  +

                                  General Limitations

                                  +

                                  Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                                  +
                                  +

                                  Consistency Between Restarts

                                  +

                                  By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                                  +
                                  +
                                  +

                                  Consistency Between Upgrades

                                  +

                                  As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                                  +
                                  +

                                  Note

                                  +

                                   You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                                  +
                                  +

                                  At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                                  +
                                  +
                                  +
                                  +

                                  Using Templated Dashboards

                                  +

                                  Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                                  +

                                  Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                                  +

                                  For example a typical graph panel would look like this:

                                  +
                                  {
                                  +    "aliasColors": {},
                                  +    "bars": false,
                                  +    "datasource": "prometheus",
                                  +    "editable": true,
                                  +    "error": false,
                                  +    "fill": 0,
                                  +    "grid": {
                                  +        "threshold1": null,
                                  +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                                  +        "threshold2": null,
                                  +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                                  +    },
                                  +    "gridPos": {
                                  +        "h": 6,
                                  +        "w": 10,
                                  +        "x": 0,
                                  +        "y": 4
                                  +    },
                                  +    "id": 2,
                                  +    "isNew": true,
                                  +    "legend": {
                                  +        "avg": false,
                                  +        "current": false,
                                  +        "max": false,
                                  +        "min": false,
                                  +        "show": false,
                                  +        "total": false,
                                  +        "values": false
                                  +    },
                                  +    "lines": true,
                                  +    "linewidth": 2,
                                  +    "links": [],
                                  +    "nullPointMode": "connected",
                                  +    "percentage": false,
                                  +    "pointradius": 5,
                                  +    "points": false,
                                  +    "renderer": "flot",
                                  +    "seriesOverrides": [
                                  +        {}
                                  +    ],
                                  +    "span": 5,
                                  +    "stack": false,
                                  +    "steppedLine": false,
                                  +    "targets": [
                                  +        {
                                  +            "expr": "sum(node_filesystem_avail) by (instance)",
                                  +            "intervalFactor": 1,
                                  +            "legendFormat": "",
                                  +            "refId": "A",
                                  +            "step": 1
                                  +        }
                                  +    ],
                                  +    "timeFrom": null,
                                  +    "timeShift": null,
                                  +    "title": "Available Disk Size",
                                  +    "tooltip": {
                                  +        "msResolution": false,
                                  +        "shared": true,
                                  +        "sort": 0,
                                  +        "value_type": "cumulative"
                                  +    },
                                  +    "transparent": false,
                                  +    "type": "graph",
                                  +    "xaxis": {
                                  +        "show": true
                                  +    },
                                  +    "yaxes": [
                                  +        {
                                  +            "format": "percent",
                                  +            "logBase": 1,
                                  +            "max": 101,
                                  +            "min": 0,
                                  +            "show": true
                                  +        },
                                  +        {
                                  +            "format": "short",
                                  +            "logBase": 1,
                                  +            "max": null,
                                  +            "min": null,
                                  +            "show": true
                                  +        }
                                  +    ]
                                  +}
                                  +
                                  +
                                  +

                                  As you can imagine, most panels would have similar values.

                                  +

                                  To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                                  +
                                  +

                                  The Template Class System

                                  +

                                  The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                                  +

                                  The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                                  +

                                  In the template file, you can also add or override attributes.

                                  +

                                  The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                                  +

                                  When generating dashboards, each class will be replaced by its definition.

                                  +

                                  For example, a row in the type.json is defined as:

                                  +
                                  {
                                  + "base_row": {
                                  +     "collapse": false,
                                  +     "editable": true
                                  + },
                                  + "row": {
                                  +     "class": "base_row",
                                  +     "height": "250px"
                                  + }
                                  + }
                                  +
                                  +
                                  +

                                  Will be used like in a template:

                                  +
                                  {
                                  +     "class": "row",
                                  +     "height": "150px",
                                  +     "panels": [
                                  +     ]
                                  +}
                                  +
                                  +
                                  +

                                  And the output will be:

                                  +
                                  {
                                  +     "class": "row",
                                  +     "collapse": false,
                                  +     "editable": true,
                                  +     "height": "150px",
                                  +     "panels": [
                                  +
                                  +     ]
                                  +}
                                  +
                                  +
                                  +

                                  We can see that the template added the panels attribute and that it overrides the height attribute.

                                  +
                                  +
                                  +

                                  Panel Example

                                  +

                                  Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                                  +
                                  {
                                  +     "class": "row",
                                  +     "panels": [
                                  +         {
                                  +             "class": "bytes_panel",
                                  +             "span": 3,
                                  +             "targets": [
                                  +                 {
                                  +                     "expr": "sum(node_filesystem_avail) by (instance)",
                                  +                     "intervalFactor": 1,
                                  +                     "legendFormat": "",
                                  +                     "metric": "",
                                  +                     "refId": "A",
                                  +                     "step": 1
                                  +                 }
                                  +             ],
                                  +             "title": "Available Disk Size"
                                  +         }
                                  +     ]
                                  +}
                                  +
                                  +
                                  +

                                  In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                                  +

                                  You can also see that the span attribute is overridden to set the panel size.

                                  +

                                  To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                                  +
                                  +
                                  +

                                  Grafana Formats and Layouts

                                  +

                                  The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                                  +

                                  Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                                  +

                                  The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                                  +

                                  To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                                  +

                                  The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                                  +

                                  You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                                  +

                                  gridPos has the following attributes:

                                  +
                                  {
                                  +   "x": 0,
                                  +   "y": 0,
                                  +   "w": 24,
                                  +   "h": 4
                                  + }
                                  +
                                  +
                                  +

                                  When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                                  +
                                  {
                                  +   "gridPos": {
                                  +      "h": 2
                                  +    }
                                  +}
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Generating the dashboards from templates (generate-dashboards.sh)

                                  +
                                  +

                                  Prerequisite

                                  +

                                  Python 2.7

                                  +

                                  make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                                  +

                                  Use the -h flag to get help information.

                                  +

                                  You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                                  +

                                  When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                                  +

                                  For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                                  +

                                  .\generate-dashboards.sh -v 2020.1

                                  +
                                  +

                                  Note

                                  +

                                  generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validation

                                  +

                                  After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                                  +

                                  Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/reference/index.html b/master/reference/index.html new file mode 100644 index 000000000..7ef43f31e --- /dev/null +++ b/master/reference/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Reference Guide

                                  +
                                  +
                                  +

                                  There are several reference guides available which give additional information. Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/reference/matrix.html b/master/reference/matrix.html new file mode 100644 index 000000000..7e4a37ca0 --- /dev/null +++ b/master/reference/matrix.html @@ -0,0 +1,855 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Support Matrix

                                  +

                                  The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                                  + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                                  Scylla Monitoring Stack Version

                                  Scylla Open Source Version

                                  Scylla Enterprise Version

                                  Node_exporter[1] Version

                                  Scylla Manager Version

                                  4.6

                                  5.2, 5.4

                                  2021.1, 2022.1, 2022.2, 2023.1, 2024.1

                                  1.4.1

                                  3.0, 3.1, 3.2

                                  4.5

                                  5.0,5.1,5.2,5.4

                                  2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                  1.4.1

                                  3.0, 3.1, 3.2

                                  4.4.5

                                  5.0,5.1,5.2,5.4

                                  2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                  1.4.1

                                  3.0, 3.1, 3.2

                                  4.4

                                  5.0,5.1,5.2

                                  2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                  1.4.1

                                  3.0, 3.1

                                  4.3

                                  5.0,5.1,5.2

                                  2020.1, 2021.1, 2022.1, 2022.2

                                  1.4.1

                                  2.5, 2.6, 3.0

                                  4.2

                                  4.5,4.6,5.0,5.1

                                  2020.1, 2021.1, 2022.1, 2022.2

                                  1.4.1

                                  2.5, 2.6, 3.0

                                  4.1

                                  4.5,4.6,5.0,5.1

                                  2020.1, 2021.1, 2022.1, 2022.2

                                  0.17

                                  2.5, 2.6, 3.0

                                  4.0

                                  4.3, 4.4, 4.5, 4.6, 5.0

                                  2020.1, 2021.1, 2022.1

                                  0.17

                                  2.3, 2.4, 2.5, 2.6, 3.0

                                  3.11

                                  4.3, 4.4, 4.5, 4.6, 5.0

                                  2020.1, 2021.1, 2022.2

                                  0.17

                                  2.3, 2.4, 2.5, 2.6

                                  3.10

                                  4.3, 4.4, 4.5, 4.6

                                  2020.1, 2021.1

                                  0.17

                                  2.3, 2.4, 2.5, 2.6

                                  3.9

                                  4.3, 4.4, 4.5, 4.6

                                  2020.1, 2021.1

                                  0.17

                                  2.3, 2.4, 2.5

                                  3.8

                                  4.3, 4.4, 4.5

                                  2020.1, 2021.1

                                  0.17

                                  2.3, 2.4, 2.5

                                  3.7

                                  4.2, 4.3, 4.4

                                  2019.1, 2020.1, 2021.1

                                  0.17

                                  2.2, 2.3

                                  3.6.3

                                  4.2, 4.3, 4.4

                                  2019.1, 2020.1, 2021.1

                                  0.17

                                  2.2, 2.3, 2.1

                                  3.6

                                  4.1, 4.2, 4.3

                                  2019.1, 2020.1

                                  0.17

                                  2.1, 2.2, 2.3

                                  3.6.1

                                  4.1, 4.2, 4.3

                                  2019.1, 2020.1

                                  0.17

                                  2.1, 2.2

                                  3.6.1

                                  4.1, 4.2, 4.3, 4.4

                                  2019.1, 2020.1

                                  0.17

                                  2.1, 2.2

                                  3.5

                                  3.3, 4.0, 4.1, 4.2

                                  2019.1, 2020.1

                                  0.17

                                  2.0, 2.1, 2.2

                                  3.4.3

                                  3.3, 4.0, 4.1, 4.2

                                  2019.1, 2020.1

                                  0.17

                                  2.0, 2.1

                                  3.4

                                  3.3, 4.0, 4.1

                                  2018.1, 2019.1

                                  0.17

                                  2.0, 2.1

                                  3.3

                                  3.1, 3.2, 3.3, 4.0

                                  2018.1, 2019.1

                                  0.17

                                  1.4, 2.0, 2.1

                                  3.2

                                  3.1, 3.2, 3.3

                                  2018.1, 2019.1

                                  0.17

                                  1.4, 2.0

                                  3.1

                                  2.3, 3.0, 3.1, 3.2

                                  2018.1, 2019.1

                                  0.17

                                  1.3, 1.4, 2.0

                                  3.0

                                  2.3, 3.0, 3.1, 3.2

                                  2018.1, 2019.1

                                  0.17

                                  1.3, 1.4

                                  2.4

                                  2.3, 3.0, 3.1

                                  2018.1, 2019.1

                                  0.14, 0.17

                                  1.3, 1.4

                                  2.3

                                  2.3, 3.0

                                  2018.1, 2019.1

                                  0.14, 0.17

                                  1.3

                                  2.2

                                  2.3, 3.0

                                  2018.1, 2019.1

                                  0.14, 0.17

                                  1.3

                                  2.1

                                  2.3, 3.0

                                  2018.1

                                  0.14, 0.17

                                  1.3

                                  +

                                  [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/reference/monitoring-apis.html b/master/reference/monitoring-apis.html new file mode 100644 index 000000000..e27064e4d --- /dev/null +++ b/master/reference/monitoring-apis.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Interfaces

                                  +

                                  Scylla exposes two interfaces for online monitoring, as described below

                                  +
                                  +

                                  Prometheus API

                                  +

                                  By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                                  +

                                  For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                                  +

                                  You can change the Prometheus listening address and port in scylla.yaml file

                                  +
                                  # prometheus port
                                  +# By default, Scylla opens prometheus API port on port 9180
                                  +# setting the port to 0 will disable the prometheus API.
                                  +prometheus_port: 9180
                                  +#
                                  +# prometheus address
                                  +# By default, Scylla binds all interfaces to the prometheus API
                                  +# It is possible to restrict the listening address to a specific one
                                  +prometheus_address: 0.0.0.0
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/robots.txt b/master/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/master/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/master/search.html b/master/search.html new file mode 100644 index 000000000..12e27e700 --- /dev/null +++ b/master/search.html @@ -0,0 +1,644 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + + + +
                                  + + + + + +
                                  + + +
                                  + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/searchindex.js b/master/searchindex.js new file mode 100644 index 000000000..952631380 --- /dev/null +++ b/master/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 18, 19, 21, 22, 23, 24, 25, 30, 31, 33, 35, 37, 38, 41], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 27, 28, 29, 30, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 27], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 30, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 26, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25, 26], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 26, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 26, 28, 29, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 26, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25, 26], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 27, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 28, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 26, 33], "user": [1, 2, 6, 7, 9, 27, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25, 26], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9], "refer": [1, 6, 9, 13], "upgrad": [1, 10, 13], "lesson": [1, 9, 28, 29, 30], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25, 26], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 27, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 30, 32, 33, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 27, 31, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25, 26], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 28, 31, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 27, 30, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 12, 14, 19, 21, 22, 23, 24, 25, 26], "onc": [2, 12, 21, 25, 32, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 26, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 26, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 28, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 26, 28, 30, 31, 33, 35, 41], "both": [2, 5, 6, 12, 19, 22, 24, 25, 26, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 27, 39, 41], "updat": [2, 5, 10, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 26, 29, 33, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25, 26], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25, 26], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 26, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18, 26], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 26, 28, 33, 34, 41], "advis": [2, 34, 41], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 26, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26], "databas": [2, 5, 7, 21, 30, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 27, 31, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 27, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25, 26], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 10, 12, 14, 16, 19, 21, 22, 24, 25, 26, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 26, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 10, 12, 25], "yaml": [2, 5, 10, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25, 26], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25, 26], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 26, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "1": [2, 5, 6, 7, 8, 12, 14, 16, 20, 22, 24, 25, 26], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 28, 31, 33, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 26, 28, 29, 30, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "24": [2, 14, 25], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25, 26], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 14, 19, 22, 24, 25, 26], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 25, 34], "json": [2, 12, 14], "9": [2, 6, 16, 25], "3": [2, 4, 5, 6, 14, 16, 20, 35], "11": [2, 6, 16], "3000": [2, 5, 6, 22, 24, 25, 26], "1000": [2, 33], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 14, 29, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25, 26], "dir": [2, 7, 8, 22, 24, 25, 26], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 12, 14, 16, 20, 24, 35], "7": [2, 5, 6, 14, 16], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 32, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "42": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25, 26], "prom_rul": [2, 5, 10, 12, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25, 26], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 7, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 26, 28, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25, 26], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 26, 30, 34, 35, 37, 39, 41], "compos": [3, 7], "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 33, 39], "section": [4, 5, 6, 10, 12, 19, 21, 24, 25, 26, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 30, 34, 35, 37, 41], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 26, 31, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25, 26], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 38], "6": [4, 5, 6, 14, 16], "node": [4, 5, 7, 12, 16, 19, 21, 28, 29, 30, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 26, 28, 30, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 25, 30, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 32, 39, 41], "need": [4, 5, 6, 7, 8, 10, 12, 14, 19, 25, 28, 29, 30, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25, 26], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 26, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 28, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 28, 34, 41], "out": [4, 5, 6, 8, 10, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25, 26], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 27, 30, 41], "take": [4, 5, 6, 7, 12, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 26, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25, 26], "help": [5, 7, 10, 14, 41], "pleas": [5, 7, 19], "most": [5, 10, 14, 25, 36, 41], "common": [5, 7, 10, 41], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 10, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25, 26], "consolid": 5, "suggest": [5, 14, 25], "those": [5, 25, 26], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 28, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 30, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 26, 28, 29, 35, 41], "support": [5, 6, 14, 15, 27, 41], "want": [5, 6, 10, 22, 24, 25, 26], "latest": [5, 6, 7, 22, 24, 25, 26], "releas": [5, 21, 22, 23, 24, 25, 26], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25, 26], "http": [5, 6, 8, 19, 21, 22, 24, 25, 26, 30, 31, 38], "com": [5, 6, 22, 24, 25, 26, 30, 31, 38], "archiv": [5, 6, 22, 24, 25, 26], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25, 26], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24, 26], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25, 26], "p": [5, 7, 8, 19, 21, 22, 24, 25, 26], "cd": [5, 6, 22, 24, 25, 26], "verifi": [5, 10, 23], "point": [5, 6, 14, 22, 24, 25, 26], "browser": [5, 6, 8, 14, 19, 22, 24, 25, 26], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 26, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 26, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 32, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 10, 12, 19, 25, 27, 30, 31, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 28, 31, 32, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 26, 30, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24, 26], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 12, 14, 27, 28, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 26, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25, 26], "scrap": [5, 7, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 12, 19, 21, 23, 25, 30, 32, 33, 39, 41], "import": [5, 6, 7, 10, 12, 21, 22, 24, 25, 26, 33], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25, 26], "code": [5, 34], "shell": 5, "correct": [5, 23, 41], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 26], "host": [5, 6, 7, 9, 19, 26], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23, 26], "127": [5, 7, 19], "right": [5, 6, 14, 41], "typic": [5, 14, 25, 28, 30, 39, 41], "node_export": [5, 6, 7, 9, 16, 26], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "5": [5, 6, 14, 16, 19, 26], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 31, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": [5, 18], "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 19, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7, 19], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 10, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25, 26], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 7, 27, 32], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24, 26], "scylla_reactor_util": 5, "At": [5, 14, 24, 25, 26], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25, 26], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 28, 29, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 34, 38], "tabl": [5, 6, 10, 16, 27, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 26, 33, 41], "give": [5, 13, 15], "strongli": [5, 41], "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 27, 30, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 26, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 26, 32, 33], "mention": [5, 14], "previous": [5, 24, 25, 26], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 31, 33, 41], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "48": 6, "10": [6, 10, 14, 16], "47": 6, "44": 6, "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "32": 6, "29": 6, "25": [6, 19], "18": 6, "avoid": [6, 14, 19, 31, 41], "root": [6, 19, 22, 24, 25, 26], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 10, 22, 24, 25, 26], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 30, 41], "higher": [6, 10, 25, 30, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 27, 28, 29], "agent": [6, 7, 8, 9, 16, 19, 26], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7, 26], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25, 26], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 38], "place": [6, 7, 8, 10, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 28, 30, 31, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 10, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25, 26], "2019": [6, 16, 38], "reach": [6, 8, 12, 30, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 30, 31, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 29, 32, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 30, 31, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "experiment": 7, "initi": 7, "stage": 7, "process": [7, 21, 33, 40], "firstli": 7, "along": 7, "env": 7, "prerequisit": 7, "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": [7, 10], "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 27, 28, 29, 30, 31, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25, 26], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 26, 34], "disk": [7, 10, 14, 19, 27, 29, 34], "possibl": [7, 10, 17, 41], "api": [7, 8, 21], "resolv": 7, "explicitli": [7, 14], "ca": 7, "optim": [7, 32, 38, 42], "drop": [7, 40, 41], "while": [7, 10, 19, 21, 22, 24, 25, 26, 33], "cdc": 7, "request": [7, 17, 40], "how": [7, 8, 10, 14, 22, 24, 25, 26, 28, 29, 30, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 10, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25, 26], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 26, 29], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 28, 29, 30, 34, 35, 41], "abov": [8, 22, 24, 25, 26], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 30, 38, 41], "email": [9, 10], "slack": [9, 10, 18], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11], "wrong": [10, 11, 14, 19, 25, 26, 39, 41], "shown": [10, 19, 22, 24, 25, 26], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21, 26], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "error": [10, 14, 25, 34, 35, 37], "annot": 10, "descript": [10, 34], "been": [10, 12], "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "low": [10, 41], "info": 10, "warn": [10, 34], "critic": 10, "inhibit": 10, "prioriti": 10, "mute": 10, "lower": [10, 41], "space": 10, "threshold": 10, "fire": 10, "silenc": 10, "signal": 10, "action": 10, "pager": 10, "duti": 10, "extens": 10, "easier": [10, 14], "dure": [10, 19, 22, 24, 25, 26], "practic": [10, 34, 38], "suitabl": 10, "rememb": 10, "overridden": [10, 14], "duplic": [10, 41], "rout": [10, 30, 41], "repres": 10, "tree": 10, "win": [10, 19], "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 28], "simul": 10, "actual": [10, 37], "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 32, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "shard": [12, 19, 25, 34], "dd": 12, "non": [12, 19, 21, 29, 30, 34, 38, 41], "cost": [12, 41], "skip": [12, 25], "care": [12, 27, 28, 29, 41], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "sever": [13, 15, 42], "explain": [14, 22, 24, 25, 26, 34], "intern": [14, 30, 41], "potenti": [14, 34, 41], "issu": [14, 19, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 31, 41], "tooltip": 14, "msresolut": 14, "share": [14, 26, 33], "sort": [14, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 31, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": 14, "usual": [14, 19, 34, 41], "wrapper": 14, "re": [14, 30], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2023": 16, "2024": 16, "2018": [16, 31], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "ask": 18, "question": 18, "discuss": 18, "forum": 18, "channel": 18, "56090": 19, "old": [19, 22, 23, 24, 25, 26], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": 19, "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 30, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 27, 28, 29, 31, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "fallback": 19, "mechan": [19, 25, 28], "present": [19, 25], "newer": [19, 24, 25, 26], "reli": [19, 25, 41], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25, 26, 41], "increas": [19, 31, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25, 26], "migrat": [21, 22, 24, 26], "lose": 21, "histor": [21, 25], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25, 26], "3001": [21, 22, 24, 25, 26], "9091": [21, 22, 24, 25, 26], "9094": 21, "fail": [21, 28, 30, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25, 26], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25, 26], "back": [21, 28], "uninstal": [22, 24, 25, 26], "minor": [22, 24, 25, 26], "9095": [22, 24, 25, 26], "brows": [22, 24, 25, 26], "satisfi": [22, 24, 25, 26], "shut": [22, 24, 25, 26], "caus": [22, 24, 25, 26, 30, 41], "blackout": [22, 24, 25, 26], "normal": [22, 24, 25, 26], "oper": [22, 24, 25, 26, 34, 41], "complet": [22, 24, 25, 26], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25, 26], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 27, 34, 41], "ensur": 25, "patch": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 29], "latenc": [25, 30, 33, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 28], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 28, 29, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "itself": 26, "almost": 26, "alwai": [26, 32], "sylladb": 26, "prevent": [26, 41], "primari": [27, 41], "kei": [27, 41], "scan": 27, "These": [27, 41], "kind": [27, 41], "bigger": 27, "replicationfactor": [28, 29], "piec": 28, "determin": [28, 29, 35, 41], "repli": [28, 29, 31, 35, 37, 41], "unavail": [28, 41], "client": [28, 31, 34, 41], "respond": 28, "accompani": 28, "deep": 28, "understand": 28, "acknowledg": 29, "coordin": [29, 30, 35, 37, 41], "hint": 29, "fact": 29, "yet": 29, "ideal": [30, 41], "resourc": [30, 41], "replic": [30, 35, 37, 41], "prepar": [30, 34, 38], "statement": [30, 32, 34, 38], "balanc": [30, 33, 34, 41], "polici": 30, "cours": 30, "intro": 30, "recap": 30, "ring": [30, 41], "architectur": 30, "chunk": [31, 41], "overal": [31, 33, 41], "thu": 31, "www": [31, 38], "07": 31, "13": 31, "effici": [31, 41], "concret": 32, "thumb": 32, "favor": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "solv": 34, "categori": [34, 41], "jump": 34, "cell": 34, "model": [34, 38, 40, 41], "awar": 34, "due": 34, "unsatisfi": 34, "faulti": 34, "cach": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "bottleneck": 38, "explan": 38, "08": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "repair": 40, "queue": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "order": 41, "BY": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13, 26], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 34, 42], "us": [2, 5, 6, 8, 12, 14, 27, 28, 29, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25, 26], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25, 26], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25, 26], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 31, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": [6, 17], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25, 26], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 26, 34, 41], "all": [7, 22, 24, 25, 26, 28], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25, 26], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 28, 29, 35, 41], "architectur": 9, "sever": 10, "ad": [10, 12, 14], "modifi": [10, 14], "tip": 10, "when": 10, "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25, 26], "limit": 14, "consist": [14, 28, 29, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25, 26], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25, 26], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25, 26], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25, 26], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25, 26], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 30, 31, 32, 38], "empti": 19, "reduc": 19, "total": 19, "number": [19, 26], "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25, 26], "latest": 21, "new": [21, 22, 23, 24, 25, 26], "4": [21, 25, 26], "move": [21, 22, 24, 25, 26], "old": 21, "b": [21, 26], "rollback": [21, 22, 23, 24, 25, 26], "link": [21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 38], "y": [22, 24, 25, 26], "": [22, 24, 25, 26], "i": [22, 24, 25, 26, 36], "run": [22, 24, 25, 26], "correct": [22, 24, 25, 26], "correctli": [22, 24, 26], "kill": [22, 24, 25, 26], "test": [24, 25, 26], "mode": [24, 25, 26], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "port": 26, "some": [27, 28, 29, 30, 31, 32, 35, 37], "allow": [27, 41], "filter": [27, 41], "univers": [28, 29, 30], "ani": 29, "token": [30, 41], "awar": [30, 41], "select": 31, "non": [31, 32], "page": [31, 41], "blog": [31, 38], "prepar": [32, 39, 41], "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "revers": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some queries are not token-aware": [[30, "some-queries-are-not-token-aware"]], "University link": [[30, "university-link"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "Some SELECT queries are non-paged": [[31, "some-select-queries-are-non-paged"]], "Blog-post Links": [[31, "blog-post-links"]], "Some queries are non-prepared": [[32, "some-queries-are-non-prepared"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "Upgrade Procedure": [[23, "upgrade-procedure"], [25, "upgrade-procedure"], [21, "upgrade-procedure"], [22, "upgrade-procedure"], [24, "upgrade-procedure"], [26, "upgrade-procedure"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Related Links": [[23, "related-links"], [25, "related-links"], [21, "related-links"], [22, "related-links"], [24, "related-links"], [26, "related-links"]], "Some queries use Consistency Level: ALL": [[28, "some-queries-use-consistency-level-all"]], "Link to Scylla university": [[28, "link-to-scylla-university"], [29, "link-to-scylla-university"]], "Some queries use Consistency Level: ANY": [[29, "some-queries-use-consistency-level-any"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Setting the server\u2019s files": [[25, "setting-the-server-s-files"], [22, "setting-the-server-s-files"], [24, "setting-the-server-s-files"], [26, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[25, "validate-the-new-version-is-running-the-correct-version"], [22, "validate-the-new-version-is-running-the-correct-version"], [24, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Kill all containers": [[25, "kill-all-containers"], [22, "kill-all-containers"], [24, "kill-all-containers"], [26, "kill-all-containers"]], "Rollback to version 3.x": [[25, "rollback-to-version-3-x"], [24, "rollback-to-version-3-x"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Some queries use ALLOW FILTERING": [[27, "some-queries-use-allow-filtering"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Validate the version installed correctly": [[22, "validate-the-version-installed-correctly"], [24, "validate-the-version-installed-correctly"], [26, "validate-the-version-installed-correctly"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b": [[26, "upgrade-guide-scylladb-monitoring-4-x-a-to-scylladb-monitoring-4-y-b"]], "Install 4.y.b (The new version)": [[26, "install-4-y-b-the-new-version"]], "Validate the port numbers": [[26, "validate-the-port-numbers"]], "Killing the new 4.y.b Monitoring stack in testing mode": [[26, "killing-the-new-4-y-b-monitoring-stack-in-testing-mode"]], "Move to version 4.y.b (the new version)": [[26, "move-to-version-4-y-b-the-new-version"]], "Rollback to version 4.x.a": [[26, "rollback-to-version-4-x-a"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alerts severity": [[10, "alerts-severity"]], "Adding Alerts": [[10, "adding-alerts"]], "Modifying Alerts": [[10, "modifying-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[17, "prometheus-api"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "System Overload": [[40, "system-overload"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "ScyllaDB Monitoring Stack": [[1, "scylladb-monitoring-stack"], [9, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Minimal Production System Recommendations": [[5, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [4, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[5, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [4, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[5, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [4, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[5, "install-scylla-monitoring-stack"], [6, "install-scylla-monitoring-stack"], [6, "id1"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/master/sitemap.xml b/master/sitemap.xml new file mode 100644 index 000000000..ef957c72b --- /dev/null +++ b/master/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/master/troubleshooting/index.html b/master/troubleshooting/index.html new file mode 100644 index 000000000..192d7a718 --- /dev/null +++ b/master/troubleshooting/index.html @@ -0,0 +1,667 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Troubleshooting Guide for Scylla Monitoring Stack

                                  +
                                  +
                                  +

                                  Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/troubleshooting/monitor-troubleshoot.html b/master/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..559f2656e --- /dev/null +++ b/master/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,886 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Troubleshoot Scylla Monitoring Stack

                                  +

                                  This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                                  +
                                  +

                                  Problem

                                  +
                                  +

                                  Scylla-Manager 2.2 with Duplicate information

                                  +

                                  Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                                  +
                                    +
                                  • For Manager server: from 56090 to 5090

                                  • +
                                  • For Manager Agent: from 56090 to 5090

                                  • +
                                  +

                                  For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                                  +

                                  However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                                  +

                                  The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                                  +

                                  Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                                  +
                                  +
                                  +

                                  A Container Fails To Start

                                  +

                                  When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                                  +
                                  Wait for Prometheus container to start........Error: Prometheus container failed to start
                                  +
                                  +
                                  +

                                  Should this happen, check the Docker logs for more information.

                                  +
                                  docker logs aprom
                                  +
                                  +
                                  +

                                  Usually the reason for the failure is described in the logs.

                                  +
                                  +
                                  +

                                  Files And Directory Permissions

                                  +
                                  +

                                  Note

                                  +

                                  Avoid running Docker containers as root.

                                  +
                                  +

                                  The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                                  +

                                  If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                                  +
                                  +

                                  Note

                                  +

                                  If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                                  +
                                  +

                                  For example if your Prometheus data directory is /prom-data and you are using centos user

                                  +
                                  ls -la /|grep prom-data
                                  +
                                  +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                                  +
                                  +sudo chown -R centos:centos /prom-data
                                  +
                                  +ls -la /|grep prom-data
                                  +
                                  +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                                  +
                                  +
                                  +
                                  +
                                  +

                                  No Data Points

                                  +

                                  No data points on all data charts.

                                  +
                                  +

                                  Solution

                                  +

                                  If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                                  +
                                    +
                                  1. Login to the Prometheus console:

                                  2. +
                                  3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                                  4. +
                                  5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                                  6. +
                                  +
                                  +
                                    +
                                  • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                                  • +
                                  • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                                  • +
                                  • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                                  • +
                                  +
                                  +

                                  For example:

                                  +
                                  ./start-all.sh -v 3.1
                                  +
                                  +
                                  +

                                  More on start-all.sh options.

                                  +
                                  +
                                  +
                                  +

                                  Grafana Chart Shows Error (!) Sign

                                  +

                                  Run this procedure on the Scylla Monitoring Stack server.

                                  +

                                  If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                                  +
                                  +

                                  Solution

                                  +

                                  On the Scylla Monitoring Stack server:

                                  +
                                    +
                                  1. Check Prometheus is running using docker ps.

                                  2. +
                                  +
                                    +
                                  • If it is not running check the prometheus.yml for errors.

                                  • +
                                  +

                                  For example:

                                  +
                                  CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                                  +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                                  +
                                  +
                                  +
                                    +
                                  • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                                  • +
                                  +
                                  +
                                  +
                                  +

                                  Grafana Shows Server Level Metrics, but not Scylla Metrics

                                  +

                                  Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                                  +
                                  +

                                  Solution

                                  +
                                    +
                                  • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                                  • +
                                  +

                                  For example

                                  +
                                  curl 172.17.0.2:9180/metrics
                                  +
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Grafana Shows Scylla Metrics, but not Server Level Metrics

                                  +

                                  Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                                  +
                                  +

                                  Solution

                                  +

                                  1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                                  +
                                    +
                                  1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                                  2. +
                                  +
                                  +
                                  +

                                  Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                                  +

                                  While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                                  +

                                  If the node_exporter service is not starting it may need to be updated manually.

                                  +

                                  Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                                  +
                                  +
                                  +
                                  +

                                  Latencies Graphs Are empty

                                  +

                                  Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                                  +

                                  During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                                  +

                                  Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                                  +

                                  If only the latency graphs are missing, it is because of missing recording rules.

                                  +

                                  This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                                  +

                                  If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                                  +
                                  +
                                  +

                                  Reducing the total number of metrics

                                  +

                                  In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                                  +
                                  +

                                  Remove interrupts from node_exporter

                                  +

                                  By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                                  +
                                  +
                                  +
                                  +

                                  Working with Wireshark

                                  +

                                  No metrics shown in the Scylla Monitoring Stack.

                                  +
                                    +
                                  1. Install wireshark

                                  2. +
                                  +

                                  2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                                  +

                                  For example:

                                  +
                                  tshark -i eth0 -f "dst port 9180"
                                  +
                                  +
                                  +

                                  Capture from Scylla node towards Scylla Monitoring Stack server.

                                  +

                                  In this example, Scylla is running.

                                  +
                                  Monitor ip        Scylla node ip
                                  +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                                  +
                                  +
                                  +

                                  In this example, Scylla is not running

                                  +
                                  Monitor ip        Scylla node ip
                                  +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                                  +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/upgrade/index.html b/master/upgrade/index.html new file mode 100644 index 000000000..92570ee1f --- /dev/null +++ b/master/upgrade/index.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Scylla Monitoring Stack

                                  +
                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/master/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..379e7f597 --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,794 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                                  +

                                  Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                                  +
                                  +

                                  Upgrade Procedure

                                  +
                                  +

                                  1. Upgrade to the latest 1.x version

                                  +

                                  Before starting the upgrade procedure, make sure you are running the latest 1.x version

                                  +
                                  +
                                  +

                                  2. Install the new monitoring stack

                                  +
                                    +
                                  1. Download the 2.x version from the release page.

                                  2. +
                                  3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                                  4. +
                                  5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                                    +
                                      +
                                    • scylla_servers.yml

                                    • +
                                    • scylla_manager_servers.yml

                                    • +
                                    • node_exporter_servers.yml

                                    • +
                                    +
                                  6. +
                                  7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                                  8. +
                                  +
                                  ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                                  +
                                  +
                                  +
                                  +

                                  Note

                                  +

                                  Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                                  +
                                  +

                                  While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                                  +
                                  ./kill-all.sh -g 3001 -p 9091 -m 9094
                                  +
                                  +
                                  +
                                  +

                                  Validation

                                  +

                                  Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                                  +
                                  +
                                  +
                                  +

                                  3. Alerting Rules

                                  +

                                  Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                                  +
                                  +
                                  +

                                  4. Moving to Prometheus 2.x

                                  +

                                  Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                                  +

                                  Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                                  +
                                  +

                                  a. Set the old system

                                  +

                                  The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                                  +
                                    +
                                  • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                                  • +
                                  • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                                  • +
                                  +
                                  +

                                  Note

                                  +

                                  After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                                  +
                                  +
                                  +
                                  +

                                  b. Set the new system

                                  +

                                  The following step will allow the new monitoring system to read historical metrics from the old system.

                                  +
                                    +
                                  • In the Prometheus prometheus.yml.template file add the following at the end:

                                  • +
                                  +
                                  remote_read:
                                  +  - url: "http://{ip}:9111/api/v1/read"
                                  +
                                  +
                                  +

                                  Where {ip} is the ip of the old system.

                                  +
                                    +
                                  • restart the new stack

                                  • +
                                  +
                                  +
                                  +
                                  +

                                  Validate the upgrade

                                  +

                                  You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                                  +
                                  +
                                  +
                                  +

                                  Rollback

                                  +

                                  In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..9bae01b55 --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,788 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                                  +
                                  +

                                  Upgrade Procedure

                                  +

                                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                  +

                                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                  +
                                  +

                                  Install 2.y (The new version)

                                  +
                                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                                  +unzip scylla-monitoring-2.y.zip
                                  +cd scylla-monitoring-scylla-monitoring-2.y/
                                  +
                                  +
                                  +

                                  Replace “y” with the new minor release number, for example, 2.1.zip

                                  +
                                  +
                                  +

                                  Setting the server’s files

                                  +

                                  Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                                  +
                                  cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                                  +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validate the new version is running the correct version

                                  +

                                  Starting from Scylla-Monitoring version 2.2, you can run:

                                  +
                                  ./start-all.sh --version
                                  +
                                  +
                                  +

                                  To validate the Scylla-Monitoring version.

                                  +
                                  +
                                  +

                                  Validate the version installed correctly

                                  +

                                  To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                                  +
                                  ./start-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                                  +

                                  Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: do not use the local dir flag when testing!

                                  +
                                  +

                                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: Do not kill the 2.x version that is currently running.

                                  +
                                  +

                                  Use the following command to kill the containers:

                                  +
                                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  You can start and stop the new 2.y version while testing.

                                  +
                                  +
                                  +

                                  Move to version 2.y (the new version)

                                  +

                                  Note: migrating will cause a few seconds of blackout in the system.

                                  +

                                  We assume that you are using external volume to store the metrics data.

                                  +
                                  +

                                  Kill all containers

                                  +

                                  Follow the instruction on how to kill the 2.y version when in testing mode.

                                  +

                                  To kill the 2.x version containers, run:

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +

                                  Start version 2.y in normal mode

                                  +

                                  From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                                  +
                                  ./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +

                                  Point your browser to http://{ip}:3000 and see that the data is there.

                                  +
                                  +
                                  +
                                  +

                                  Rollback to version 2.x

                                  +

                                  To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                                  +

                                  To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                                  +
                                  ./kill-all.sh
                                  +cd /path/to/scylla-grafana-2.x/
                                  +./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +
                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..627f0eb33 --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,752 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                                  +

                                  Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                                  +
                                  +

                                  Upgrade Procedure

                                  +
                                  +

                                  1. Validate node_exporter version

                                  +

                                  Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                                  +

                                  If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                                  +
                                  +
                                  +

                                  2. Install the new monitoring stack

                                  +
                                    +
                                  1. Download the 3.x version from the release page.

                                  2. +
                                  3. Unzip it into a different directory.

                                  4. +
                                  5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                                    +
                                      +
                                    • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                                    • +
                                    • scylla_manager_servers.yml

                                    • +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                                    +
                                    +
                                    +
                                  6. +
                                  7. Stop the old monitoring stack

                                    +
                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +
                                    +
                                  8. +
                                  9. Start the new monitoring stack

                                    +
                                    +
                                    ./start-all.sh -d /prometheus-data-path
                                    +
                                    +
                                    +
                                    +
                                  10. +
                                  +
                                  +
                                  +

                                  Validate the upgrade

                                  +

                                  You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                                  +

                                  Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                                  +
                                  +
                                  +
                                  +

                                  Rollback

                                  +

                                  To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..f98dc71c3 --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                                  +
                                  +

                                  Upgrade Procedure

                                  +

                                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                  +

                                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                  +
                                  +

                                  Install 3.y (The new version)

                                  +
                                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                                  +unzip scylla-monitoring-3.y.zip
                                  +cd scylla-monitoring-scylla-monitoring-3.y/
                                  +
                                  +
                                  +

                                  Replace “y” with the new minor release number, for example, 3.0.1.zip

                                  +
                                  +
                                  +

                                  Setting the server’s files

                                  +

                                  Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                  +
                                  cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                  +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validate the new version is running the correct version

                                  +

                                  Starting from Scylla-Monitoring version 2.2, you can run:

                                  +
                                  ./start-all.sh --version
                                  +
                                  +
                                  +

                                  To validate the Scylla-Monitoring version.

                                  +
                                  +
                                  +

                                  Validate the version installed correctly

                                  +

                                  To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                                  +
                                  ./start-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                                  +

                                  Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: do not use the local dir flag when testing!

                                  +
                                  +

                                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: Do not kill the 3.x version that is currently running.

                                  +
                                  +
                                  +
                                  +

                                  Killing the new 3.y Monitoring stack in testing mode

                                  +

                                  Use the following command to kill the containers:

                                  +
                                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  You can start and stop the new 3.y version while testing.

                                  +
                                  +
                                  +

                                  Move to version 3.y (the new version)

                                  +

                                  Note: migrating will cause a few seconds of blackout in the system.

                                  +

                                  We assume that you are using external volume to store the metrics data.

                                  +
                                  +

                                  Kill all containers

                                  +

                                  At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                  +

                                  Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                                  +

                                  kill the older 3.x version containers by running:

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +

                                  Start version 3.y in normal mode

                                  +

                                  From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                                  +
                                  ./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +

                                  Point your browser to http://{ip}:3000 and see that the data is there.

                                  +
                                  +
                                  +
                                  +

                                  Rollback to version 3.x

                                  +

                                  To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                  +

                                  To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                                  +
                                  ./kill-all.sh
                                  +cd /path/to/scylla-grafana-3.x/
                                  +./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +
                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..9450a0e2f --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,939 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                                  +
                                  +

                                  Upgrade Procedure

                                  +

                                  We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                                  +

                                  Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                                  +
                                  +

                                  Install 4.y (The new version)

                                  +
                                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                                  +unzip scylla-monitoring-4.y.zip
                                  +cd scylla-monitoring-scylla-monitoring-4.y/
                                  +
                                  +
                                  +

                                  Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                                  +
                                  +
                                  +

                                  Setting the server’s files

                                  +

                                  Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                  +
                                  cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                  +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validate the new version is running the correct version

                                  +

                                  run:

                                  +
                                  ./start-all.sh --version
                                  +
                                  +
                                  +

                                  To validate the Scylla-Monitoring version.

                                  +
                                  +
                                  +
                                  +

                                  Running in test mode

                                  +

                                  This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                                  +
                                  +

                                  Running second monitoring stack

                                  +

                                  We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                                  +
                                  ./start-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  Browse to http://{ip}:9091 and check the Grafana dashboard.

                                  +

                                  Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: do not use the local dir flag when testing!

                                  +
                                  +

                                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: Do not kill the 3.x version that is currently running!

                                  +
                                  +
                                  +
                                  +

                                  Killing the new 4.y Monitoring stack in testing mode

                                  +

                                  Use the following command to kill the containers:

                                  +
                                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  You can start and stop the new 4.y version while testing.

                                  +
                                  +
                                  +
                                  +

                                  Migrating

                                  +
                                  +

                                  Move to version 4.y (the new version)

                                  +

                                  Note: migrating will cause a few seconds of blackout in the system.

                                  +

                                  We assume that you are using external volume to store the metrics data.

                                  +
                                  +

                                  Backup

                                  +

                                  We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                                  +
                                  +
                                  +

                                  Kill all containers

                                  +

                                  At this point you have two monitoring stacks installed with the older version running.

                                  +

                                  If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                                  +

                                  kill the older 3.x version containers by running:

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +

                                  Start version 4.y in normal mode

                                  +

                                  From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                                  +
                                  ./start-all.sh -d /path/to/copy/data/dir
                                  +
                                  +
                                  +

                                  Point your browser to http://{ip}:3000 and see that the data is there.

                                  +
                                  +
                                  +
                                  +

                                  Rollback to version 3.x

                                  +

                                  To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                  +

                                  To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                                  +
                                  ./kill-all.sh
                                  +cd /path/to/scylla-grafana-3.x/
                                  +./start-all.sh -d /path/to/original/data/dir
                                  +
                                  +
                                  +
                                  +
                                  +
                                  +

                                  Post-installation: Metrics back-filling

                                  +

                                  Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                                  +

                                  For example, this is a recording rule that calculates the p99 write latency:

                                  +
                                  - record: wlatencyp99
                                  +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                                  +  labels:
                                  +    by: "instance,shard"
                                  +
                                  +
                                  +

                                  For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                                  +

                                  Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                                  +
                                  +
                                  +

                                  Note

                                  +

                                  If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                                  +
                                  +
                                  +
                                  +../_images/before-backfilling.png +
                                  +

                                  This is an example of missing latency graph

                                  +
                                  +
                                  +

                                  The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                                  +

                                  For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                                  +

                                  In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                                  +

                                  The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                                  +
                                  +

                                  Determine the backfilling period

                                  +

                                  When you run the backfilling process you need to determine the start time and end time.

                                  +
                                  +

                                  Determine the start time

                                  +

                                  The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                                  +

                                  If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                                  +

                                  For the rest of this example, we will assume that your retention time is 360 days.

                                  +
                                  +
                                  +

                                  Determine the end time

                                  +

                                  Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                                  +

                                  If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                                  +

                                  That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                                  +

                                  The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                                  +
                                  +
                                  +
                                  +

                                  Backfilling Process

                                  +
                                  +

                                  backup

                                  +

                                  If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                                  +

                                  To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                                  +
                                  +
                                  +

                                  Restart the monitoring stack

                                  +

                                  You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                                  +

                                  -b "--storage.tsdb.allow-overlapping-blocks"

                                  +
                                  +
                                  +

                                  Create the data files

                                  +

                                  We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                                  +

                                  The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                                  +

                                  Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                                  +
                                  docker exec -it aprom sh
                                  +cd /prometheus/data/
                                  +promtool tsdb create-blocks-from rules \
                                  +--start $start \
                                  +--end $end \
                                  +--url http://localhost:9090 \
                                  +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                                  +
                                  +
                                  +

                                  It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                                  +
                                  +
                                  +

                                  Note

                                  +

                                  Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Copy the data files

                                  +

                                  Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                                  +

                                  Copy the data files to the Prometheus directory:

                                  +
                                  cp data/* .
                                  +
                                  +
                                  +

                                  The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                                  +

                                  Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                                  +
                                  +../_images/after-backfilling.jpg +
                                  +

                                  Un example: after loading half of the data

                                  +
                                  +
                                  +
                                  +
                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/master/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..e32c30892 --- /dev/null +++ b/master/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,811 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b

                                  +

                                  This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1.

                                  +
                                  +

                                  Upgrade Procedure

                                  +

                                  We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                  +

                                  Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                  +
                                  +

                                  Install 4.y.b (The new version)

                                  +
                                  wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip
                                  +unzip scylla-monitoring-4.y.b.zip
                                  +cd scylla-monitoring-scylla-monitoring-4.y.b/
                                  +
                                  +
                                  +

                                  Replace “y” with the new minor release number, for example, 4.0.1.zip

                                  +
                                  +
                                  +

                                  Setting the server’s files

                                  +

                                  Copy the target files scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                  +
                                  cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/
                                  +cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/
                                  +
                                  +
                                  +
                                  +

                                  Validate the port numbers

                                  +

                                  ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent.

                                  +

                                  Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target.

                                  +
                                  +

                                  Caution

                                  +

                                  As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics.

                                  +
                                  +
                                  +
                                  +
                                  +

                                  Validate the new version is running the correct version

                                  +

                                  Run:

                                  +
                                  ./start-all.sh --version
                                  +
                                  +
                                  +

                                  To validate the Scylla-Monitoring version.

                                  +
                                  +
                                  +

                                  Validate the version installed correctly

                                  +

                                  To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack.

                                  +
                                  ./start-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  Browse to http://{ip}:9091 +And check the Grafana dashboard

                                  +

                                  Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: do not use the local dir flag when testing!

                                  +
                                  +

                                  When you are satisfied with the data in the dashboard, you can shut down the containers.

                                  +
                                  +

                                  Caution

                                  +

                                  Important: Do not kill the 4.x.a version that is currently running.

                                  +
                                  +
                                  +
                                  +

                                  Killing the new 4.y.b Monitoring stack in testing mode

                                  +

                                  Use the following command to kill the containers:

                                  +
                                  ./kill-all.sh -p 9091 -g 3001 -m 9095
                                  +
                                  +
                                  +

                                  You can start and stop the new 4.y.b version while testing.

                                  +
                                  +
                                  +

                                  Move to version 4.y.b (the new version)

                                  +

                                  Note: migrating will cause a few seconds of blackout in the system.

                                  +

                                  We assume that you are using external volume to store the metrics data.

                                  +
                                  +

                                  Kill all containers

                                  +

                                  At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                  +

                                  Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y.b Monitoring stack in testing mode +in the previous section

                                  +

                                  kill the older 4.x.a version containers by running:

                                  +
                                  ./kill-all.sh
                                  +
                                  +
                                  +

                                  Start version 4.y.b in normal mode

                                  +

                                  From the new root of the scylla-monitoring-scylla-monitoring-4.y.b run

                                  +
                                  ./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +

                                  Point your browser to http://{ip}:3000 and see that the data is there.

                                  +
                                  +
                                  +
                                  +

                                  Rollback to version 4.x.a

                                  +

                                  To rollback during the testing mode, follow Killing the new 4.y.b Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                  +

                                  To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run:

                                  +
                                  ./kill-all.sh
                                  +cd /path/to/scylla-grafana-4.x.a/
                                  +./start-all.sh -d /path/to/data/dir
                                  +
                                  +
                                  +
                                  +
                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlAllowFiltering.html b/master/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..8bd0a24e1 --- /dev/null +++ b/master/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Some queries use ALLOW FILTERING

                                  +

                                  Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                                  +

                                  These kinds of queries can create a bigger load on Scylla, and should be used with care.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlCLAll.html b/master/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..218903254 --- /dev/null +++ b/master/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,690 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Some queries use Consistency Level: ALL

                                  +

                                  Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                                  +

                                  Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                                  +

                                  Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlCLAny.html b/master/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..5098ad0c7 --- /dev/null +++ b/master/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Some queries use Consistency Level: ANY

                                  +

                                  Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                                  +

                                  Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlNoTokenAware.html b/master/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..0b9b2bd85 --- /dev/null +++ b/master/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Some queries are not token-aware

                                  +

                                  Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                                  +

                                  Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlNonPaged.html b/master/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..9ca9199f3 --- /dev/null +++ b/master/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,688 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Some SELECT queries are non-paged

                                  +

                                  By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                                  +
                                  +

                                  Blog-post Links

                                  +

                                  https://www.scylladb.com/2018/07/13/efficient-query-paging/

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/cqlNonPrepared.html b/master/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..a874ebeeb --- /dev/null +++ b/master/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Some queries are non-prepared

                                  +

                                  Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/heavyCompaction.html b/master/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..8904bbdf1 --- /dev/null +++ b/master/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,691 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Compaction takes lots of memory and CPU

                                  +

                                  ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                                  +

                                  If this is the case, you can do one of the following:

                                  +
                                    +
                                  • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                                    +
                                    +
                                      +
                                    • In the scylla.yml configuration file: compaction_static_shares: 100

                                    • +
                                    • In the command line when starting ScyllaDB: --compaction-static-shares 100

                                    • +
                                    +
                                    +

                                    You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                                    +
                                  • +
                                  • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                                  • +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/index.html b/master/use-monitoring/advisor/index.html new file mode 100644 index 000000000..cf7a72506 --- /dev/null +++ b/master/use-monitoring/advisor/index.html @@ -0,0 +1,704 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Scylla Monitoring Stack Advisor

                                  +
                                  +
                                  +

                                  The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                                  +
                                  +

                                  The Advisor section

                                  +
                                  +../../_images/advisor_panel.png +
                                  +

                                  The Advisor section

                                  +
                                  +
                                  +

                                  The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                                  +

                                  For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                                  +

                                  Each Advisor issue is explained in detail:

                                  + +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/nodeCLErrors.html b/master/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..375dd06ed --- /dev/null +++ b/master/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Some operation failed due to unsatisfied consistency level

                                  +

                                  ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                                  +

                                  For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                                  +

                                  When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/nodeIOErrors.html b/master/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..ba211f68d --- /dev/null +++ b/master/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  I/O Errors can indicate a node with a faulty disk

                                  +

                                  I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/nodeLocalErrors.html b/master/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..aa2768f8a --- /dev/null +++ b/master/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,674 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Some operations failed on the replica side

                                  +

                                  ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                                  +

                                  An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/nonBalancedcqlTraffic.html b/master/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..9b2bc33bc --- /dev/null +++ b/master/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  CQL queries are not balanced among shards

                                  +

                                  For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                                  +

                                  There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                                  +
                                  +

                                  Blog post link

                                  +

                                  https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/preparedCacheEviction.html b/master/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..05b4f2d77 --- /dev/null +++ b/master/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  Prepared statements cache eviction

                                  +

                                  Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                                  +
                                    +
                                  • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                                  • +
                                  • The prepared statements cache might be too small for the number of prepared statements.

                                  • +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/advisor/systemOverload.html b/master/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..f6a36b5ac --- /dev/null +++ b/master/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  System Overload

                                  +

                                  There could be multiple indications that a system is overloaded:

                                  +
                                    +
                                  • Timeouts

                                  • +
                                  • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                                  • +
                                  • CPU at 100% when no background process (like compaction or repair) runs.

                                  • +
                                  • Queues are getting filled.

                                  • +
                                  +

                                  If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/cql-optimization.html b/master/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..e722fe9ae --- /dev/null +++ b/master/use-monitoring/cql-optimization.html @@ -0,0 +1,796 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + + + +
                                  +

                                  The CQL Optimization

                                  +

                                  The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                                  +
                                  +../_images/cql_optimization_master.png +
                                  +

                                  The CQL Dashboard

                                  +
                                  +
                                  +

                                  The upper part of the dashboard holds CQL related metrics.

                                  +

                                  The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                                  +
                                  +

                                  Note

                                  +

                                  Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                                  +
                                  +

                                  The following sections describe each of the dashboard’s panel

                                  +
                                  +

                                  Prepared Statements

                                  +

                                  Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                                  +

                                  Using prepared statements has the following benefits:

                                  +
                                    +
                                  • The database only needs to parse the query once

                                  • +
                                  • The driver can route the query to the right node

                                  • +
                                  • Using place-holders and values is safer and prevents CQL-Injection

                                  • +
                                  +

                                  The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                                  +

                                  The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                                  +
                                  +
                                  +

                                  Token Aware

                                  +

                                  Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                                  +

                                  Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                                  +

                                  The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                                  +

                                  The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                                  +
                                  +
                                  +

                                  Paged Queries

                                  +

                                  By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                                  +

                                  The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                                  +

                                  The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                                  +
                                  +
                                  +

                                  Reversed CQL Reads

                                  +

                                  ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                                  +

                                  We strongly recommend using use the correct ordering. +Querying with an order different than the order the CLUSTERING ORDER BY was defined is supported, but not advisable.

                                  +

                                  For example, look at the following table:

                                  +
                                  CREATE TABLE ks1.table_demo (
                                  +   category text,
                                  +   type int,
                                  +   PRIMARY KEY (category, type))
                                  +WITH CLUSTERING ORDER BY (type DESC);
                                  +
                                  +
                                  +

                                  The following query uses reverse order:

                                  +
                                  select * from ks1.table_demo where category='cat1' order by type ASC;
                                  +
                                  +
                                  +

                                  The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                                  +

                                  The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                                  +
                                  +
                                  +

                                  ALLOW FILTERING

                                  +

                                  Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                                  +

                                  These kinds of queries can create a big load on the system, and should be used with care.

                                  +

                                  The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                                  +

                                  The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                                  +

                                  The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                                  +

                                  The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                                  +

                                  The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                                  +
                                  +
                                  +

                                  Consistency Level

                                  +

                                  Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                                  +

                                  The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                                  +

                                  Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                                  +

                                  The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                                  +

                                  The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                                  +

                                  The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                                  +

                                  The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                                  +
                                  +
                                  +

                                  Cross DC

                                  +

                                  Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                                  +
                                  +
                                  +

                                  Cross DC Consistency Level

                                  +

                                  Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                                  +
                                  +
                                  +

                                  Cross DC read requests

                                  +
                                  +

                                  Note

                                  +

                                  The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                                  +
                                  +

                                  In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                                  +

                                  The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                                  +
                                  +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/master/use-monitoring/index.html b/master/use-monitoring/index.html new file mode 100644 index 000000000..05b7da1c5 --- /dev/null +++ b/master/use-monitoring/index.html @@ -0,0 +1,666 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                  + + + +
                                  +
                                  + Menu +
                                  +
                                  +
                                  +
                                  +
                                  + + +
                                  +

                                  Caution

                                  +

                                  + + You're viewing documentation for an unstable version of ScyllaDB Monitoring. + + Switch to the latest stable version. +

                                  +
                                  + + + +
                                  + +
                                  + +
                                  +

                                  Using Scylla Monitoring Stack

                                  +
                                  +
                                  +

                                  There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                                  + +
                                  + + +
                                  + + + + + + + +
                                  + +
                                  + + + + +
                                  + + + + + + + \ No newline at end of file diff --git a/stable/.buildinfo b/stable/.buildinfo new file mode 100644 index 000000000..30d137fdc --- /dev/null +++ b/stable/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 0e7f732cdc46a695b064c8436421d5c2 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/stable/.doctrees/common/monitor-description.doctree b/stable/.doctrees/common/monitor-description.doctree new file mode 100644 index 000000000..75fad65ab Binary files /dev/null and b/stable/.doctrees/common/monitor-description.doctree differ diff --git a/stable/.doctrees/environment.pickle b/stable/.doctrees/environment.pickle new file mode 100644 index 000000000..88ddc1866 Binary files /dev/null and b/stable/.doctrees/environment.pickle differ diff --git a/stable/.doctrees/index.doctree b/stable/.doctrees/index.doctree new file mode 100644 index 000000000..876b6e785 Binary files /dev/null and b/stable/.doctrees/index.doctree differ diff --git a/stable/.doctrees/install/docker-compose.doctree b/stable/.doctrees/install/docker-compose.doctree new file mode 100644 index 000000000..fe56618aa Binary files /dev/null and b/stable/.doctrees/install/docker-compose.doctree differ diff --git a/stable/.doctrees/install/index.doctree b/stable/.doctrees/install/index.doctree new file mode 100644 index 000000000..84c6ee62b Binary files /dev/null and b/stable/.doctrees/install/index.doctree differ diff --git a/stable/.doctrees/install/min-prod-hw.doctree b/stable/.doctrees/install/min-prod-hw.doctree new file mode 100644 index 000000000..acb21656c Binary files /dev/null and b/stable/.doctrees/install/min-prod-hw.doctree differ diff --git a/stable/.doctrees/install/monitor-without-docker.doctree b/stable/.doctrees/install/monitor-without-docker.doctree new file mode 100644 index 000000000..41d3ec98e Binary files /dev/null and b/stable/.doctrees/install/monitor-without-docker.doctree differ diff --git a/stable/.doctrees/install/monitoring-stack.doctree b/stable/.doctrees/install/monitoring-stack.doctree new file mode 100644 index 000000000..aa7fef80b Binary files /dev/null and b/stable/.doctrees/install/monitoring-stack.doctree differ diff --git a/stable/.doctrees/install/start-all.doctree b/stable/.doctrees/install/start-all.doctree new file mode 100644 index 000000000..e649dedc3 Binary files /dev/null and b/stable/.doctrees/install/start-all.doctree differ diff --git a/stable/.doctrees/install/thanos.doctree b/stable/.doctrees/install/thanos.doctree new file mode 100644 index 000000000..bd13b9719 Binary files /dev/null and b/stable/.doctrees/install/thanos.doctree differ diff --git a/stable/.doctrees/intro.doctree b/stable/.doctrees/intro.doctree new file mode 100644 index 000000000..f009cbf42 Binary files /dev/null and b/stable/.doctrees/intro.doctree differ diff --git a/stable/.doctrees/procedures/alerts/alerting.doctree b/stable/.doctrees/procedures/alerts/alerting.doctree new file mode 100644 index 000000000..237e599d9 Binary files /dev/null and b/stable/.doctrees/procedures/alerts/alerting.doctree differ diff --git a/stable/.doctrees/procedures/alerts/index.doctree b/stable/.doctrees/procedures/alerts/index.doctree new file mode 100644 index 000000000..c54aff500 Binary files /dev/null and b/stable/.doctrees/procedures/alerts/index.doctree differ diff --git a/stable/.doctrees/procedures/datadog/index.doctree b/stable/.doctrees/procedures/datadog/index.doctree new file mode 100644 index 000000000..b3359785e Binary files /dev/null and b/stable/.doctrees/procedures/datadog/index.doctree differ diff --git a/stable/.doctrees/procedures/index.doctree b/stable/.doctrees/procedures/index.doctree new file mode 100644 index 000000000..6a1a7aaae Binary files /dev/null and b/stable/.doctrees/procedures/index.doctree differ diff --git a/stable/.doctrees/procedures/updating-dashboard.doctree b/stable/.doctrees/procedures/updating-dashboard.doctree new file mode 100644 index 000000000..645bb14b1 Binary files /dev/null and b/stable/.doctrees/procedures/updating-dashboard.doctree differ diff --git a/stable/.doctrees/reference/index.doctree b/stable/.doctrees/reference/index.doctree new file mode 100644 index 000000000..c0a5a4211 Binary files /dev/null and b/stable/.doctrees/reference/index.doctree differ diff --git a/stable/.doctrees/reference/matrix.doctree b/stable/.doctrees/reference/matrix.doctree new file mode 100644 index 000000000..b3b56d8ef Binary files /dev/null and b/stable/.doctrees/reference/matrix.doctree differ diff --git a/stable/.doctrees/reference/monitoring-apis.doctree b/stable/.doctrees/reference/monitoring-apis.doctree new file mode 100644 index 000000000..896ae1c5f Binary files /dev/null and b/stable/.doctrees/reference/monitoring-apis.doctree differ diff --git a/stable/.doctrees/troubleshooting/index.doctree b/stable/.doctrees/troubleshooting/index.doctree new file mode 100644 index 000000000..502f92ee7 Binary files /dev/null and b/stable/.doctrees/troubleshooting/index.doctree differ diff --git a/stable/.doctrees/troubleshooting/monitor-troubleshoot.doctree b/stable/.doctrees/troubleshooting/monitor-troubleshoot.doctree new file mode 100644 index 000000000..1c407eed0 Binary files /dev/null and b/stable/.doctrees/troubleshooting/monitor-troubleshoot.doctree differ diff --git a/stable/.doctrees/upgrade/index.doctree b/stable/.doctrees/upgrade/index.doctree new file mode 100644 index 000000000..45cc82851 Binary files /dev/null and b/stable/.doctrees/upgrade/index.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree new file mode 100644 index 000000000..c40625f94 Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree new file mode 100644 index 000000000..1d41f2f36 Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..fa39db804 Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree new file mode 100644 index 000000000..2c1b55a99 Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..349ed7bb2 Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.doctree differ diff --git a/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree new file mode 100644 index 000000000..2932387bc Binary files /dev/null and b/stable/.doctrees/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree b/stable/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree new file mode 100644 index 000000000..9a32233e7 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlAllowFiltering.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlCLAll.doctree b/stable/.doctrees/use-monitoring/advisor/cqlCLAll.doctree new file mode 100644 index 000000000..a3df77fb5 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlCLAll.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlCLAny.doctree b/stable/.doctrees/use-monitoring/advisor/cqlCLAny.doctree new file mode 100644 index 000000000..9381fd493 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlCLAny.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree b/stable/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree new file mode 100644 index 000000000..600c3a6d3 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlNoTokenAware.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree b/stable/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree new file mode 100644 index 000000000..d7460037e Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlNonPaged.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree b/stable/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree new file mode 100644 index 000000000..3abba7b65 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/cqlNonPrepared.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/heavyCompaction.doctree b/stable/.doctrees/use-monitoring/advisor/heavyCompaction.doctree new file mode 100644 index 000000000..edf23f1de Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/heavyCompaction.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/index.doctree b/stable/.doctrees/use-monitoring/advisor/index.doctree new file mode 100644 index 000000000..10a554cb6 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/index.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree b/stable/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree new file mode 100644 index 000000000..2a46e01c3 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/nodeCLErrors.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree b/stable/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree new file mode 100644 index 000000000..703a72773 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/nodeIOErrors.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree b/stable/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree new file mode 100644 index 000000000..b5fd393e8 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/nodeLocalErrors.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree b/stable/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree new file mode 100644 index 000000000..1d9b42cc6 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/nonBalancedcqlTraffic.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree b/stable/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree new file mode 100644 index 000000000..aa768ecf0 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/preparedCacheEviction.doctree differ diff --git a/stable/.doctrees/use-monitoring/advisor/systemOverload.doctree b/stable/.doctrees/use-monitoring/advisor/systemOverload.doctree new file mode 100644 index 000000000..9278fae11 Binary files /dev/null and b/stable/.doctrees/use-monitoring/advisor/systemOverload.doctree differ diff --git a/stable/.doctrees/use-monitoring/cql-optimization.doctree b/stable/.doctrees/use-monitoring/cql-optimization.doctree new file mode 100644 index 000000000..240f7fbaa Binary files /dev/null and b/stable/.doctrees/use-monitoring/cql-optimization.doctree differ diff --git a/stable/.doctrees/use-monitoring/index.doctree b/stable/.doctrees/use-monitoring/index.doctree new file mode 100644 index 000000000..04e60c4d1 Binary files /dev/null and b/stable/.doctrees/use-monitoring/index.doctree differ diff --git a/stable/.nojekyll b/stable/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/stable/404.html b/stable/404.html new file mode 100644 index 000000000..8a6a079b5 --- /dev/null +++ b/stable/404.html @@ -0,0 +1,31 @@ + + + + + + + + + ScyllaDB + + + + + + + + + + + +
                                  +

                                  404

                                  +

                                  The ScyllaDB monster ate your page!

                                  +

                                  + Home +

                                  +
                                  + + + \ No newline at end of file diff --git a/stable/CNAME b/stable/CNAME new file mode 100644 index 000000000..21f0985f3 --- /dev/null +++ b/stable/CNAME @@ -0,0 +1 @@ +monitoring.docs.scylladb.com \ No newline at end of file diff --git a/stable/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml b/stable/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml new file mode 100644 index 000000000..3e85b60ab --- /dev/null +++ b/stable/_downloads/0d91ecdf045d215637d56f0b81f5603a/datadog.rules.yml @@ -0,0 +1,576 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count_total + expr: sum(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests_total + expr: sum(scylla_transport_requests_served{}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count_total + expr: sum(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_out_of_space + expr: count(min(node_filesystem_avail_bytes/node_filesystem_size_bytes) by (cluster, instance) < 0.1) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_network_receive_bytes_total + expr: sum(node_network_receive_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_bytes_total + expr: sum(node_network_transmit_bytes_total) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes + expr: sum(rate(node_disk_read_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_read_bytes_total + expr: sum(node_disk_read_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes + expr: sum(rate(node_disk_written_bytes_total[2m])) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_disk_written_bytes_total + expr: sum(node_disk_written_bytes_total) by (cluster, device) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_scylladb_current_version_total + expr: count(scylla_scylladb_current_version) by (cluster, version) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_total + expr: sum(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: sum(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_total + expr: sum(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_network_receive_packets_total + expr: sum(node_network_receive_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_network_transmit_packets_total + expr: sum(node_network_transmit_packets_total) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_failed_ag + expr: sum(rate(scylla_database_total_writes_failed[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_writes_timedout_ag + expr: sum(rate(scylla_database_total_writes_timedout[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_failed_ag + expr: sum(rate(scylla_database_total_reads_failed{class="user"}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_database_total_reads_rate_limited_ag + expr: sum(rate(scylla_database_total_reads_rate_limited[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_manager_last_success_ts + expr: max(scylla_manager_scheduler_last_success{}) by(cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_nodes_uptime_ts + expr: min(node_boot_time_seconds) by(cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_cores + expr: count(scylla_reactor_utilization{}) by (cluster) + labels: + by: "cluster" + dd: "1" + - record: scylla_manager_scheduler_suspended_ag + expr: max(scylla_manager_scheduler_suspended{}) by (cluster) + labels: + by: "cluster" + dd: "1" diff --git a/stable/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json b/stable/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json new file mode 100644 index 000000000..4ae26e52c --- /dev/null +++ b/stable/_downloads/1d0fbd862a69c00f6c66cbfbb459380a/monitor.json @@ -0,0 +1,18 @@ +{ + "name": "Disk space is running low {{cluster.name}} {{instance.name}} ", + "type": "query alert", + "query": "min(last_5m):avg:scylla.scylla_node_filesystem_avail_bytes{by:cluster} by {cluster,instance,mountpoint} / avg:scylla.scylla_node_filesystem_size_bytes{by:cluster} by {cluster,instance,mountpoint} < 0.1", + "message": "One of the disk partitions {{mountpoint.name}} is running out of disk space.\n\nCheck {{instance.name}} that belongs to {{cluster.name}} ", + "tags": [], + "options": { + "thresholds": { + "critical": 0.1 + }, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "new_group_delay": 60 + } +} + diff --git a/stable/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml b/stable/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml new file mode 100644 index 000000000..35f134eb0 --- /dev/null +++ b/stable/_downloads/55110650a2d5181badc62c6c37f68075/cloud-conf.yaml @@ -0,0 +1,126 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: https://us-east-1.aws.metrics.cloud.scylladb.com/api/v1/cluster/CLUSTER_ID/proxy/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + extra_headers: + Authorization: "Bearer TOKEN" + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/stable/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json b/stable/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json new file mode 100644 index 000000000..67ecdb04a --- /dev/null +++ b/stable/_downloads/8e23d84763f852c22d1a8bca59d8f420/dashboard.json @@ -0,0 +1 @@ +{"title":"Scylla-Cloud","description":"This dashboard provides a high-level overview of your Scylla cluster to help you monitor its performance and resource usage. \n\nClone this template dashboard to make changes and add your own graphs and widgets. (cloned)","widgets":[{"id":0,"layout":{"x":1,"y":13,"width":30,"height":33},"definition":{"title":"Node status","title_size":"16","title_align":"left","type":"query_table","requests":[{"formulas":[{"alias":"Operation Mode","conditional_formats":[{"palette":"white_on_gray","value":0,"comparator":"<="},{"palette":"white_on_green","value":3,"comparator":"<="},{"palette":"white_on_red","value":3,"comparator":">"}],"limit":{"count":50,"order":"desc"},"formula":"query1"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_node_operation_mode{$cluster,$dc,$instance} by {instance}","data_source":"metrics","name":"query1","aggregator":"last"}]}],"custom_links":[]}},{"id":1,"layout":{"x":1,"y":1,"width":30,"height":12},"definition":{"type":"image","url":"/static/images/logos/scylla_large.svg","sizing":"fit"}},{"id":2,"layout":{"x":33,"y":8,"width":27,"height":17},"definition":{"title":"Reactor Utilization (%)","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_reactor_utilization_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"min":"0","max":"100"},"custom_links":[]}},{"id":3,"layout":{"x":102,"y":8,"width":27,"height":17},"definition":{"title":"Coordinator Requests served $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_total_requests{$cluster,$instance,$dc,$by,$scheduling_group_name} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4,"layout":{"x":33,"y":28,"width":120,"height":5},"definition":{"type":"note","content":"Coordinator Reads and Writes","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":5,"layout":{"x":72,"y":35,"width":36,"height":18},"definition":{"title":"Average Write Latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6,"layout":{"x":72,"y":54,"width":36,"height":18},"definition":{"title":"Average Read latency $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencya{$cluster,$instance,$scheduling_group_name,$by} by {scheduling_group_name,instance,cluster,dc,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7,"layout":{"x":33,"y":106,"width":38,"height":18},"definition":{"title":"Cache hits $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_hits{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"cool","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":8,"layout":{"x":72,"y":106,"width":36,"height":18},"definition":{"title":"Cache misses $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_row_misses{$cluster,$instance,$dc,$by} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"warm","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":9,"layout":{"x":109,"y":131,"width":36,"height":18},"definition":{"title":"Read timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":10,"layout":{"x":33,"y":131,"width":38,"height":18},"definition":{"title":"Write timeouts","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_timeouts_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":11,"layout":{"x":33,"y":35,"width":38,"height":18},"definition":{"title":"Write requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_write_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":12,"layout":{"x":33,"y":54,"width":38,"height":18},"definition":{"title":"Read requests $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_coordinator_read_count{$cluster,$instance,$by,$scheduling_group_name,$dc} by {dc,instance,cluster,shard,scheduling_group_name}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":14,"layout":{"x":33,"y":1,"width":120,"height":5},"definition":{"type":"note","content":"Overview","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":15,"layout":{"x":33,"y":99,"width":120,"height":5},"definition":{"type":"note","content":"Cache","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":16,"layout":{"x":109,"y":106,"width":36,"height":18},"definition":{"title":"Cache MB used $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_ag_cache_bytes_used{$cluster,$instance,$by,$dc} by {cluster,dc,instance,shard}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1084170435256950,"layout":{"x":109,"y":54,"width":36,"height":18},"definition":{"title":"p95 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":2910671079228770,"layout":{"x":61,"y":8,"width":24,"height":17},"definition":{"title":"Disk Usage $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"alias":"Available Size","style":{"palette":"red"},"formula":"query3"},{"alias":"Used","formula":"query1 - query2"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster}","data_source":"metrics","name":"query3"},{"query":"avg:scylla.scylla_node_filesystem_size_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_node_filesystem_avail_bytes{$cluster,$dc,$instance,$by,$mountpoint} by {cluster,instance,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7714885897954064,"layout":{"x":146,"y":54,"width":36,"height":18},"definition":{"title":"p99 Read latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.rlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":4260397812259784,"layout":{"x":109,"y":35,"width":36,"height":18},"definition":{"title":"p95 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp95{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6404285183751502,"layout":{"x":146,"y":35,"width":36,"height":18},"definition":{"title":"p99 Write latency $by","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.wlatencyp99{$cluster,$instance,$scheduling_group_name,$by} by {instance,scheduling_group_name,by,shard,dc,cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":6799935691210890,"layout":{"x":33,"y":124,"width":120,"height":5},"definition":{"type":"note","content":"Timeouts and Errors","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":8578124602713126,"layout":{"x":72,"y":131,"width":36,"height":18},"definition":{"title":"Write Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_write_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":7744631424303374,"layout":{"x":146,"y":131,"width":36,"height":18},"definition":{"title":"Read Unavailable","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"per_second(query1)"}],"response_format":"timeseries","queries":[{"query":"sum:scylla.scylla_storage_proxy_coordinator_read_unavailable_ag{$cluster,$instance,$dc} by {cluster}","data_source":"metrics","name":"query1"}],"style":{"palette":"green","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4483288196297726,"layout":{"x":130,"y":8,"width":26,"height":17},"definition":{"title":"Backup and Repair","title_size":"16","title_align":"left","show_legend":true,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"query1 * 100"},{"formula":"query2 * 100"}],"response_format":"timeseries","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster} by {cluster}","data_source":"metrics","name":"query1"},{"query":"avg:scylla.scylla_manager_repair_progress{$cluster} by {cluster}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}]}},{"id":7082509374944536,"layout":{"x":157,"y":8,"width":12,"height":17},"definition":{"title":"Backup Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_backup_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":4398985445570504,"layout":{"x":170,"y":8,"width":12,"height":17},"definition":{"title":"Repair Progress","title_size":"16","title_align":"left","type":"query_value","requests":[{"formulas":[{"formula":"query1 * 100"}],"response_format":"scalar","queries":[{"query":"avg:scylla.scylla_manager_repair_progress{$cluster}","data_source":"metrics","name":"query1","aggregator":"avg"}]}],"autoscale":true,"custom_unit":"%","precision":0,"timeseries_background":{"type":"area"}}},{"id":7668417540546962,"layout":{"x":85,"y":8,"width":16,"height":17},"definition":{"title":"Disks Full","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"type":"timeseries","requests":[{"formulas":[{"formula":"exclude_null(cutoff_min(1 - query1 / query2, 0.9))","style":{"palette":"warm"}}],"response_format":"timeseries","queries":[{"query":"max:scylla.scylla_node_filesystem_avail_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query1"},{"query":"max:scylla.scylla_node_filesystem_size_bytes{$cluster} by {instance,mountpoint,cluster,dc}","data_source":"metrics","name":"query2"}],"style":{"palette":"dog_classic","line_type":"solid","line_width":"normal"},"display_type":"line"}],"markers":[{"value":"y = 1","display_type":"error bold"}]}},{"id":8931485274504480,"layout":{"x":33,"y":72,"width":120,"height":5},"definition":{"type":"note","content":"Network","background_color":"gray","font_size":"18","text_align":"center","show_tick":true,"tick_pos":"50%","tick_edge":"bottom"}},{"id":3216511357119388,"layout":{"x":33,"y":79,"width":38,"height":18},"definition":{"title":"Received Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":1482826489392148,"layout":{"x":109,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Packets $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_packets{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":4324092003141290,"layout":{"x":72,"y":79,"width":36,"height":18},"definition":{"title":"Received Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_receive_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}},{"id":6786209057078918,"layout":{"x":146,"y":79,"width":36,"height":18},"definition":{"title":"Transmit Bytes $by","title_size":"16","title_align":"left","show_legend":false,"legend_layout":"auto","legend_columns":["avg","min","max","value","sum"],"time":{},"type":"timeseries","requests":[{"formulas":[{"formula":"query1"}],"queries":[{"query":"avg:scylla.node_network_transmit_bytes{$cluster,$instance,$by,$dc} by {dc,instance,cluster}","data_source":"metrics","name":"query1"}],"response_format":"timeseries","style":{"palette":"purple","line_type":"solid","line_width":"normal"},"display_type":"line"}],"yaxis":{"include_zero":true,"scale":"linear","label":"","min":"auto","max":"auto"},"custom_links":[]}}],"template_variables":[{"name":"cluster","prefix":"cluster","available_values":[],"default":"*"},{"name":"dc","prefix":"dc","available_values":[],"default":"*"},{"name":"instance","prefix":"instance","available_values":[],"default":"*"},{"name":"scheduling_group_name","prefix":"scheduling_group_name","available_values":[],"default":"*"},{"name":"by","prefix":"by","available_values":[],"default":"cluster"},{"name":"mountpoint","prefix":"mountpoint","available_values":[],"default":"/var/lib/scylla"}],"layout_type":"free","notify_list":[],"id":"r42-yag-cuw"} \ No newline at end of file diff --git a/stable/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml b/stable/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml new file mode 100644 index 000000000..598c3244e --- /dev/null +++ b/stable/_downloads/a7125545ebbccbf5ec65f35e45219c1b/datadog.rules-with-shards.yml @@ -0,0 +1,393 @@ +groups: +- name: scylla.rules + rules: + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_read_count + expr: sum(rate(scylla_storage_proxy_coordinator_read_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_total_requests + expr: sum(rate(scylla_transport_requests_served{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_coordinator_write_count + expr: sum(rate(scylla_storage_proxy_coordinator_write_latency_count{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, instance, shard, scheduling_group_name) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_hits + expr: sum(rate(scylla_cache_row_hits{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_row_misses + expr: sum(rate(scylla_cache_row_misses{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_avail_bytes + expr: sum(node_filesystem_avail_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_avail_bytes + expr: avg(node_filesystem_avail_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_total_size_bytes + expr: sum(node_filesystem_size_bytes) by (cluster, mountpoint) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_node_filesystem_size_bytes + expr: avg(node_filesystem_size_bytes) by (cluster, mountpoint, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_ag_cache_bytes_used + expr: avg(rate(scylla_cache_bytes_used{}[60s])) by (cluster, dc, instance, shard) + labels: + by: "instance,shard" + level: "2" + dd: "2" + - record: scylla_storage_proxy_coordinator_read_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_reactor_utilization_ag + expr: avg(scylla_reactor_utilization{}) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_read_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_read_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_timeouts_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_timeouts{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (scheduling_group_name, cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_write_unavailable_ag + expr: avg(rate(scylla_storage_proxy_coordinator_write_unavailable{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}[60s])) by (cluster, dc, scheduling_group_name, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_packets + expr: sum(rate(node_network_receive_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_packets + expr: sum(rate(node_network_transmit_packets_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_receive_bytes + expr: sum(rate(node_network_receive_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: node_network_transmit_bytes + expr: sum(rate(node_network_transmit_bytes_total{}[2m])) by (device,cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_connection + expr: sum(scylla_transport_current_connections) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_nodes + expr: count(scylla_scylladb_current_version{job="scylla"}) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_unreachable_nodes + expr: count(scrape_samples_scraped{job="scylla"}==0) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_joining_nodes + expr: count(scylla_node_operation_mode<3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_leaving_nodes + expr: count(scylla_node_operation_mode>3) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_manager_tasks + expr: sum(scylla_manager_task_active_count{type=~"repair|backup"}) by (cluster, type) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_total_compactios + expr: sum(scylla_compaction_manager_completed_compactions) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, scheduling_group_name) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, scheduling_group_name) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_storage_proxy_coordinator_background_writes_ag + expr: sum(scylla_storage_proxy_coordinator_background_writes{scheduling_group_name!~"atexit|gossip|mem_compaction|memtable|streaming|background_reclaim|compaction|main|memtable_to_cache"}) by (cluster, dc, instance, scheduling_group_name) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_written_ag + expr: sum(rate(scylla_hints_manager_written[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster) + labels: + by: "cluster" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc) + labels: + by: "dc" + level: "1" + dd: "1" + - record: scylla_hints_manager_sent_ag + expr: sum(rate(scylla_hints_manager_sent[60s])) by (cluster, dc, instance) + labels: + by: "instance" + level: "1" + dd: "1" diff --git a/stable/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml b/stable/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml new file mode 100644 index 000000000..b054bc90b --- /dev/null +++ b/stable/_downloads/c0d96642845dab62e24773bd681249f8/conf.yaml @@ -0,0 +1,124 @@ +init_config: + +instances: + + ## @param prometheus_url - string - required + ## The URL where your application metrics are exposed by Prometheus. + # + - prometheus_url: http://IP:9090/federate?match[]={dd=~"1"} + + ## @param namespace - string - required + ## The namespace to be appended before all metrics namespace + # + namespace: scylla + + ## @param metrics - list of key:value elements - required + ## List of `: ` for metrics to be fetched from the prometheus endpoint. + ## is optional. It transforms the name in Datadog if set. + ## This list should contain at least one metric + # + metrics: + - scylla_* + - wlatency* + - rlatency* + - cql* + - manager* + - errors* + - node* + + scrape_interval: 10s + + ## @param prometheus_metrics_prefix - string - optional + ## Prefix for exposed Prometheus metrics. + # + # prometheus_metrics_prefix: _ + + ## @param health_service_check - boolean - optional - default: true + ## Send a service check reporting about the health of the prometheus endpoint + ## It will be named .prometheus.health + # + # health_service_check: true + + ## @param label_to_hostname - string - optional + ## Override the hostname with the value of one label. + # + label_to_hostname: instance + + ## @param label_joins - object - optional + ## The label join allows to target a metric and retrieve it's label via a 1:1 mapping + # + # label_joins: + # target_metric: + # label_to_match: + # labels_to_get: + # - + + ## @param labels_mapper - list of key:value element - optional + ## The label mapper allows you to rename some labels + ## Format is : + # + # labels_mapper: + # flavor: origin + + ## @param type_overrides - list of key:value element - optional + ## Type override allows you to override a type in the prometheus payload + ## or type an untyped metrics (they're ignored by default) + ## Supported are `gauge`, `counter`, `histogram`, `summary` + # + #type_overrides: + ## @param tags - list of key:value element - optional + ## List of tags to attach to every metric, event and service check emitted by this integration. + ## + ## Learn more about tagging: https://docs.datadoghq.com/tagging/ + # + # tags: + # - : + # - : + + ## @param send_histograms_buckets - boolean - optional - default: true + ## Set send_histograms_buckets to true to send the histograms bucket. + # + # send_histograms_buckets: true + + ## @param send_monotonic_counter - boolean - optional - default: true + ## To send counters as monotonic counter + ## + ## see: https://github.com/DataDog/integrations-core/issues/1303 + # + # send_monotonic_counter: true + + ## @param exclude_labels - list of string - optional + ## List of label to be excluded. + # + # exclude_labels: + # - timestamp + + ## @param ssl_cert - string - optional + ## If your prometheus endpoint is secured, here are the settings to configure it + ## Can either be only the path to the certificate and thus you should specify the private key + ## or it can be the path to a file containing both the certificate & the private key + # + # ssl_cert: "" + + ## @param ssl_private_key - string - optional + ## Needed if the certificate does not include the private key + ## WARNING: The private key to your local certificate must be unencrypted. + # + # ssl_private_key: "" + + ## @param ssl_ca_cert - string - optional + ## The path to the trusted CA used for generating custom certificates. Set this to false to disable SSL certificate + ## verification. + # + # ssl_ca_cert: "" + + ## @param prometheus_timeout - integer - optional - default: 10 + ## Set a timeout in second for the prometheus query. + # + # prometheus_timeout: 10 + + ## @param max_returned_metrics - integer - optional - default: 2000 + ## The check limits itself to 2000 metrics by default, increase this limit if needed. + # + max_returned_metrics: 20000 + diff --git a/stable/_images/1.png b/stable/_images/1.png new file mode 100644 index 000000000..08503be1c Binary files /dev/null and b/stable/_images/1.png differ diff --git a/stable/_images/2.png b/stable/_images/2.png new file mode 100644 index 000000000..5e5823a1e Binary files /dev/null and b/stable/_images/2.png differ diff --git a/stable/_images/3.png b/stable/_images/3.png new file mode 100644 index 000000000..558f8912a Binary files /dev/null and b/stable/_images/3.png differ diff --git a/stable/_images/advisor_panel.png b/stable/_images/advisor_panel.png new file mode 100644 index 000000000..89b9a5950 Binary files /dev/null and b/stable/_images/advisor_panel.png differ diff --git a/stable/_images/after-backfilling.jpg b/stable/_images/after-backfilling.jpg new file mode 100644 index 000000000..c6d8cfa3c Binary files /dev/null and b/stable/_images/after-backfilling.jpg differ diff --git a/stable/_images/alertmanager.png b/stable/_images/alertmanager.png new file mode 100644 index 000000000..e15e0452d Binary files /dev/null and b/stable/_images/alertmanager.png differ diff --git a/stable/_images/before-backfilling.png b/stable/_images/before-backfilling.png new file mode 100644 index 000000000..d9fd47d12 Binary files /dev/null and b/stable/_images/before-backfilling.png differ diff --git a/stable/_images/cql_optimization_master.png b/stable/_images/cql_optimization_master.png new file mode 100644 index 000000000..a41c628c9 Binary files /dev/null and b/stable/_images/cql_optimization_master.png differ diff --git a/stable/_images/datadog.png b/stable/_images/datadog.png new file mode 100644 index 000000000..1d67d1cd3 Binary files /dev/null and b/stable/_images/datadog.png differ diff --git a/stable/_images/grafana.png b/stable/_images/grafana.png new file mode 100644 index 000000000..541ced7ed Binary files /dev/null and b/stable/_images/grafana.png differ diff --git a/stable/_images/monitor.png b/stable/_images/monitor.png new file mode 100644 index 000000000..cf691ecb3 Binary files /dev/null and b/stable/_images/monitor.png differ diff --git a/stable/_images/monitoring_stack.png b/stable/_images/monitoring_stack.png new file mode 100644 index 000000000..63e29eb58 Binary files /dev/null and b/stable/_images/monitoring_stack.png differ diff --git a/stable/_images/monitoring_stack1.png b/stable/_images/monitoring_stack1.png new file mode 100644 index 000000000..2f272c923 Binary files /dev/null and b/stable/_images/monitoring_stack1.png differ diff --git a/stable/_sources/common/monitor-description.rst.txt b/stable/_sources/common/monitor-description.rst.txt new file mode 100644 index 000000000..7b14bbcb3 --- /dev/null +++ b/stable/_sources/common/monitor-description.rst.txt @@ -0,0 +1 @@ +ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling. diff --git a/stable/_sources/index.rst.txt b/stable/_sources/index.rst.txt new file mode 100644 index 000000000..3dbe94edd --- /dev/null +++ b/stable/_sources/index.rst.txt @@ -0,0 +1,40 @@ +=========================== +ScyllaDB Monitoring Stack +=========================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + Introduction + Download and Install + User Guide + Procedures + Upgrade + Troubleshooting + Reference + GitHub Project + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers: + +* `prometheus` - collects and stores metrics +* `alertmanager` - handles alerts +* `grafana` - dashboard server + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* :doc:`Upgrade ` + +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University +* `ScyllaDB Monitoring Stack GitHub Project `_ diff --git a/stable/_sources/install/docker-compose.rst.txt b/stable/_sources/install/docker-compose.rst.txt new file mode 100644 index 000000000..04b486b0b --- /dev/null +++ b/stable/_sources/install/docker-compose.rst.txt @@ -0,0 +1,78 @@ +Using Docker Compose +==================== + +Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the `start-all.sh` and `kill-all.sh` scripts. + +Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack. + +.. warning:: + + *docker-compose* **and** *start_all.sh* are two **alternative** ways to launch Scylla Monitoring Stack. + You should use **one** method, **not both**. In particular, creating and updating *docker-compose.yml* is ignored + when using *start_all.sh* + +Prerequisite +------------ + +Make sure you have `docker` and `docker-compose` installed. + +Setting Prometheus +------------------ + +The Prometheus configuration file contains among others the IP address of the *alertmanager* and either the location +of the *scylla_server.yml* file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning. + +You can use `./prometheus-config.sh` to generate the file, for example: + +.. code-block:: shell + + ./prometheus-config.sh --compose + +For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below). + +Setting Grafana Provisioning +---------------------------- + +Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location. + +Grafana Data-Source file +^^^^^^^^^^^^^^^^^^^^^^^^ +Run the following command to update the datasource: + +.. code-block:: shell + + ./grafana-datasource.sh --compose + +You can see the generated file under: `grafana/provisioning/datasources/datasource.yaml` + +Grafana Dashboard Load file +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To set the dashboard load file, you can run the `./generate-sashboards.sh` with the `-t` command line flag and the `-v` flag to specify the version. +For example, Scylla-enterprise version 2020.1: + +.. code-block:: shell + + ./generate-dashboards.sh -t -v 2020.1 + +This command generates the files under: `grafana/provisioning/dashboards/` + +Docker Compose file +------------------- +You can use the following example as a base for your docker compose. + +Pass the following to a file called `docker-compose.yml` + + +.. literalinclude:: docker-compose.example.yml + :language: ruby + + +Start and Stop +^^^^^^^^^^^^^^ + +To start the Scylla Monitoring Stack run ``docker-compose up`` and to stop run ``docker-compose down``. diff --git a/stable/_sources/install/index.rst.txt b/stable/_sources/install/index.rst.txt new file mode 100644 index 000000000..1967e7249 --- /dev/null +++ b/stable/_sources/install/index.rst.txt @@ -0,0 +1,25 @@ +============================================ +Download and Install Scylla Monitoring Stack +============================================ + +.. toctree:: + :maxdepth: 2 + :hidden: + + Install + The start-all.sh script + Deploy without Docker + Docker Compose + System Recommendations + Using Thanos + + +Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling. + +Choose a topic to begin: + +* :doc:`Install Scylla Monitoring Stack ` +* :doc:`The start-all.sh script ` +* :doc:`Deploy Scylla Monitoring Stack Without Docker ` +* :doc:`Running using Docker Compose ` +* :doc:`Using Thanos ` diff --git a/stable/_sources/install/min-prod-hw.rst.txt b/stable/_sources/install/min-prod-hw.rst.txt new file mode 100644 index 000000000..8737a3a8c --- /dev/null +++ b/stable/_sources/install/min-prod-hw.rst.txt @@ -0,0 +1,75 @@ +Minimal Production System Recommendations +----------------------------------------- + +* **CPU** - at least 2 physical cores/ 4vCPUs +* **Memory** - 15GB+ DRAM and proportional to the number of cores. +* **Disk** - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section) +* **Network** - 1GbE/10GbE preferred + +Calculating Prometheus Minimal Disk Space requirement +..................................................... + +Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume + +Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s. + +For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need **minimal** disk space for prometheus of + +.. code:: + + 6 * 16 * 15 * 12MB ~ 16GB + + +To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box. + +Calculating Prometheus Minimal Memory Space requirement +....................................................... + +Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration). + +For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server. + +.. raw:: html + + +
                                  + + + + + + + + + + + +
                                  # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                  00
                                  + +
                                  + \ No newline at end of file diff --git a/stable/_sources/install/monitor-without-docker.rst.txt b/stable/_sources/install/monitor-without-docker.rst.txt new file mode 100644 index 000000000..02cdaef2e --- /dev/null +++ b/stable/_sources/install/monitor-without-docker.rst.txt @@ -0,0 +1,503 @@ +================================================ +Deploying Scylla Monitoring Stack Without Docker +================================================ +Introduction +------------ +The following instructions will help to deploy `Scylla Monitoring Stack `_ in cases where you can not use the recommended Docker version. + +Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system. + +Scylla Monitoring uses the following components: + +* Alertmanager +* Grafana Loki +* Prometheus +* Grafana + +The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components. + +We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service. + + + +.. include:: min-prod-hw.rst + +The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data. + +.. note:: Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the `Scylla Monitoring Stack Compatibility Matrix
                                  `_. + +Install Scylla Monitoring Stack +------------------------------- + +The following procedure uses a ``CentOS 7`` based instance + +1. Download the latest Scylla Monitoring Stack release. + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-|version|.tar.gz + + +2. Open the tar + +``tar -xvf scylla-monitoring-*.tar.gz`` + +Install Alertmanager +-------------------- + +Tested with alertmanager 0.22.2 version + +1. Install `alertmanager`_ + +.. _`alertmanager` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz + tar -xvf alertmanager-*.linux-amd64.tar.gz + + +2. Copy the following file: ``rule_config.yml`` from ``prometheus/`` directory to ``alertmanager.yml`` in the alertmanager installation directory. + +For example: + +.. code-block:: shell + :substitutions: + + cp -p /home/centos/scylla-monitoring-scylla-monitoring-|version|/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml + +3. Start the Alertmanager + +For example: + +.. code-block:: shell + + cd alertmanager-0.22.2.linux-amd64 + ./alertmanager + + +4. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9093/ + +.. image:: alertmanager.png + +Install Grafana Loki +-------------------- + +Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana `documentation`_ if you want to use it for centralized log collection. + +.. _`documentation` : https://grafana.com/docs/loki/latest/ + +We recomand using Loki with containers, but you can install it locally as described in `Loki installation `_ + +You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager. + +Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server. + +**Loki Related files** + + +Loki has a configuration file and a rule file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/loki/rules + mkdir -p /etc/loki/config + cp loki/rules/* /etc/loki/rules + cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml + +Edit ``/etc/loki/config/loki-config.yaml`` and replace ``ALERTMANAGER`` with the alertmanager ip:port (i.e. localhost:9093) + +**Promtail Related files** + +Promtail has a configuration file. You need to copy and modify the configuration. + +.. code-block:: shell + + mkdir -p /etc/promtail/ + loki/promtail/promtail_config.template.yml /etc/promtail/config.yml + +Edit ``/etc/promtail/config.yml`` and replace ``LOKI_IP`` with Loki's ip:port (i.e. localhost:3100) + +Install Prometheus +------------------ + +Tested with Prometheus version 2.27.1 + +.. note:: + If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. + The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work. + +1. Install `Prometheus`_ + +.. _`Prometheus` : https://prometheus.io/download/ + +.. code-block:: shell + + wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz + tar -xvf prometheus-*.linux-amd64.tar.gz + +2. Create Data and Config directories +.. code-block:: shell + + mkdir -p /prometheus/data + mkdir -p /etc/prometheus/prom_rules/ + mkdir -p /etc/scylla.d/prometheus/ + + +3. Copy the following files: ``scylla_servers.yml``, ``prometheus.rules.yml`` from ``prometheus/`` directory to Prometheus installation directory. + +Copy ``prometheus/prometheus.yml.template`` to ``prometheus.yml`` + +For example: + +.. code-block:: shell + :substitutions: + + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/ + cp scylla-monitoring-scylla-monitoring-|version|/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml + + +4. Edit the ``prometheus.yml`` file to point to the correct static data sources. + +.. note:: Make sure to include the ``honor_labels: false`` parameter in the prometheus.yml file. + +.. code-block:: shell + + vi /etc/prometheus/prometheus.yml + +Set the alertmanger address and port by replacing ``AM_ADDRESS`` in the file. + +For example if the alertmanager will run on the same host: + +.. code-block:: shell + + alerting: + alertmanagers: + - static_configs: + - targets: + - 127.0.0.1:9093 + +Replace the `files` in to point to the right local file, typically for `scylla`, `node_exporter` and `manager_agent` you can use the same file (`scylla_servers.yml`). + + +For example the scrape config for Scylla: + +.. code-block:: shell + + global: + scrape_interval: 5s # By default, scrape targets every 5 second. + scrape_timeout: 4s # Timeout before trying to scape a target again + + # Attach these labels to any time series or alerts when communicating with + # external systems (federation, remote storage, Alertmanager). + external_labels: + monitor: 'scylla-monitor' + + scrape_configs: + - job_name: scylla + honor_labels: false + file_sd_configs: + - files: + - /etc/scylla.d/prometheus/scylla_servers.yml + relabel_configs: + - source_labels: [__address__] + regex: '([^:]+)' + target_label: __address__ + replacement: '${1}:9180' + + - source_labels: [__address__] + regex: '(.*):.+' + target_label: instance + replacement: '${1}' + + +5. Create and set ``scylla_servers.yml`` file point to your Scylla nodes and ``scylla_manager_server.yml`` file to point to your Scylla Manager. + +.. note:: + There is no need to configure ``node_exporter_server``. Instead, in the Prometheus scrape config of the node_exporter + you can use the same file you used for Scylla and Prometheus will assume you have a ``node_exporter`` running on each Scylla server. + + +An example for those files can be found under the Prometheus directory: ``prometheus/scylla_servers.example.yml`` and ``prometheus/scylla_manager_servers.example.yml`` + + +.. note:: + You must have both files even if you are not using Scylla Manager + + +Add the labels for the cluster and data-center + +``scylla_servers.yml``: + +For example: + +.. code-block:: shell + + cat scylla_servers.yml + # List Scylla end points + + - targets: + - 192.168.66.6 + - 192.168.66.244 + labels: + cluster: cluster1 + dc: dc1 + - targets: + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc2 + +.. note:: + See the previous note about deprecating the ``node_exporter_servers.yml`` file. + +``scylla_manager_server.yml`` + +For example: + +.. code-block:: shell + + - targets: + - 127.0.0.1:5090 + +6. Start Prometheus server: + +For example: + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + ./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data + +Data should start accumulate on: /prometheus/data + +7. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port + +For example: + +.. code-block:: shell + + http://192.168.135.166:9090/ + +.. image:: 1.png + +Prometheus console should be visible + +8. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console + +For example: + +``node_memory_MemFree`` + +.. image:: 2.png + +And + +``scylla_reactor_utilization`` + +.. image:: 3.png + +At this point Scylla is emitting the metrics and Prometheus is able to store them. + +Install Grafana +--------------- + +Tested with Grafna 7.5.7 + +1. Install Grafana based on the instructions `here `_ + +Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps. + +2. Access Scylla-Grafana-monitoring directory + +.. code-block:: shell + :substitutions: + + cd scylla-monitoring-scylla-monitoring-|version|/ + +3. Copy the plugins to the grafana plugins directory (by default ``/var/lib/grafana/``) + +.. code-block:: shell + + sudo cp -r grafana/plugins /var/lib/grafana/ + +If you installed Grafana from packages, instead of ``/var/lib/grafana/`` you should copy it to ``public/app`` inside the directory you +opened Grafana in. + +For example: + +.. code-block:: shell + + cp -r grafana/plugins ../grafana-7.5.7/public/app + +4. Provision the Dashboards + +For example Scylla Open-source version 4.5 and Scylla manager version 2.4 + +For Grafana installed with ``yum install`` + +.. code-block:: shell + + sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/ + sudo mkdir -p /var/lib/grafana/dashboards + sudo cp -r grafana/build/* /var/lib/grafana/dashboards + +For Grafana installed from packages + +.. code-block:: shell + + cp -p -r grafana/build/* ../grafana-7.5.7/public/build/ + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml + cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml + +Edit the ``load.*`` files in ``/home/centos/grafana-7.5.7/conf/provisioning/dashboards/`` for the correct path, +for example ``load.4.5.yaml`` would point to: ``/home/centos/grafana-7.5.7/public/build/ver_4.5``. + +.. note:: A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER. + + +5. Set the data source by copy ``datasource.yml`` and edit it + +.. code-block:: shell + + sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/ + +.. note:: Scylla uses a plugin to read from some system tables see the section below about using it. + +For Grafana installed from packages + +.. code-block:: shell + + cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/ + +You should set the Prometheus and the alertmanager IP and port. + +For example + +.. code-block:: shell + + sudo cat /etc/grafana/provisioning/datasources/datasource.yml + apiVersion: 1 + datasources: + - name: prometheus + type: prometheus + url: http://192.168.135.167:9090 + access: proxy + basicAuth: false + + - name: alertmanager + type: camptocamp-prometheus-alertmanager-datasource + orgId: 1 + typeLogoUrl: public/img/icn-datasource.svg + access: proxy + url: http://192.168.135.166:9093 + password: + user: + database: + basicAuth: + isDefault: + jsonData: + severity_critical: '4' + severity_high: '3' + severity_warning: '2' + severity_info: '1' + +6. Start the Grafana service + +For Grafana installed with `yum install` + +``sudo service grafana-server start`` + +For Grafana installed from packages: + +``cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini`` + +Edit scylla.ini to reflect the right paths in the paths section of the file. + + +.. code-block:: shell + + plugins = /home/centos/grafana-7.5.7/data/plugins + provisioning = /home/centos/grafana-7.5.7/conf/provisioning + + +Start the server: + +.. code-block:: shell + + cd /home/centos/grafana-7.5.7/ + ./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini + +7. Make sure Grafana is running + +Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server. + +.. image:: grafana.png + + +Using Scylla Plugin with Grafana +-------------------------------- + +Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers. + +Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user. + +Setting a monitoring user +......................... + +This part is optional, but is highly recommended. The instruction at `enable authorization`_ covers all the following items in details. + +.. _`enable authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + +* If you have not done so, `enable authorization`_ first. +* Add a new ROLL for the scylla monitoring: ``CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true;`` make sure to give it a proper password. +* Add SELECT permissions to the new user: ``GRANT SELECT on KEYSPACE system TO scylla_monitoring``; + + + +Installing the Plugin +..................... + +Grafana reads plugins from its plugin directory, copy Scylla Plugin from  'grafana/plugins/scylla-datasource' as described in the Grafana installation section. + +Configure the Plugin +.................... + +Add an entry to the datasource.yml file + +.. code-block:: shell + + - name: scylla-datasource + type: scylladb-scylla-datasource +   orgId: 1 +   isDefault: + jsonData: + host: '' + #  secureJsonData: + #    user: 'scylla_monitoring' + #    password: 'scylla_monitoring' + +As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file. + +Enable the Plugin +................. + +Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana ``grafana.ini`` file and add +the line ``allow_loading_unsigned_plugins: scylladb-scylla-datasource``. + +See more about it the `Grafana configuration`_. + +.. _`grafana configuration`: https://grafana.com/docs/grafana/latest/administration/configuration/#allow_loading_unsigned_plugins + diff --git a/stable/_sources/install/monitoring-stack.rst.txt b/stable/_sources/install/monitoring-stack.rst.txt new file mode 100644 index 000000000..5843f351a --- /dev/null +++ b/stable/_sources/install/monitoring-stack.rst.txt @@ -0,0 +1,412 @@ +=============================== +Install Scylla Monitoring Stack +=============================== + +This document describes the setup of Scylla Monitoring Stack, based on :ref:`API_Prometheus`. + +The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API. + +For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below. + +.. include:: min-prod-hw.rst + +Prerequisites +------------- + +* Follow the Installation Guide and install `docker`_ on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can :doc:`Deploy Scylla Monitoring Stack Without Docker
                                  `. +* If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below. + +.. _`docker`: https://docs.docker.com/install/ + +.. list-table:: Scylla Monitoring Stack Compatibility Matrix + :widths: 33 33 33 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Prometheus Version + - Grafana Version + * - 4.6 + - 2.48.1 + - 10.2.2 + * - 4.5 + - 2.47.1 + - 10.1.5 + * - 4.4 + - 2.44.0 + - 9.5.2 + * - 4.3 + - 2.42.0 + - 9.3.8 + * - 4.2 + - 2.41.0 + - 9.3.4 + * - 4.1 + - 2.38.0 + - 9.1.0 + * - 4.0 + - 2.34.0 + - 8.5.2 + * - 3.11 + - 2.32.0 + - 8.3.4 + * - 3.10 + - 2.32.0 + - 8.3.3 + * - 3.9.2 + - 2.29.1 + - 8.2.7 + * - 3.9 + - 2.29.1 + - 8.1.1 + * - 3.8 + - 2.27.1 + - 7.5.7 + * - 3.7 + - 2.25.2 + - 7.4.0 + * - 3.6 + - 2.18.1 + - 7.3.5 + * - 3.5 + - 2.18.1 + - 7.1.5 + * - 3.4 + - 2.18.1 + - 6.7.3 + +Docker Post Installation +------------------------ + +Docker post installation guide can be found `here`_ + +.. _`here`: https://docs.docker.com/install/linux/linux-postinstall/ + +.. note:: + + Avoid running the container as root. + +To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group. + +1. Create the Docker group. + +.. code-block:: sh + + sudo groupadd docker + +2. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login. + +.. code-block:: sh + + sudo usermod -aG docker $USER + +3. Start Docker by calling: + +.. code-block:: sh + + sudo systemctl enable docker + +Install Scylla Monitoring Stack +------------------------------- + +**Procedure** + +1. Download and extract the latest `Scylla Monitoring Stack binary`_;. + +.. _`Scylla Monitoring Stack binary`: https://github.com/scylladb/scylla-monitoring/releases + +.. code-block:: sh + :substitutions: + + wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-|version|.tar.gz + tar -xvf scylla-monitoring-|version|.tar.gz + cd scylla-monitoring-scylla-monitoring-|version| + +As an alternative, you can clone and use the Git repository directly. + +.. code-block:: sh + :substitutions: + + git clone https://github.com/scylladb/scylla-monitoring.git + cd scylla-monitoring + git checkout |branch_version| + +2. Start Docker service if needed + +.. code-block:: sh + + sudo systemctl restart docker + +Configure Scylla Monitoring Stack +--------------------------------- + +To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager). + +This configuration can be done from files, or using the Consul_ api. + +.. _Consul: https://www.consul.io/ + + +Scylla Manager 2.0 and higher supports the Consul API. + +Configure Scylla nodes from files +................................. + + +1. Create ``prometheus/scylla_servers.yml`` with the targets' IPs (the servers you wish to monitor). + +.. note:: + It is important that the name listed in ``dc`` in the ``labels`` matches the datacenter names used by Scylla. + Use the ``nodetool status`` command to validate the datacenter names used by Scylla. + +For example: + +.. code-block:: yaml + + - targets: + - 172.17.0.2 + - 172.17.0.3 + labels: + cluster: cluster1 + dc: dc1 + +.. note:: If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you `added the cluster`_ to Scylla Manager. It is important that the label ``cluster name`` and the cluster name in Scylla Manager match. + +.. _`added the cluster`: https://manager.docs.scylladb.com/stable/add-a-cluster.html + +*Using IPV6* + +To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets. + +For example: + +.. code-block:: yaml + + - targets: + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]" + - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]" + labels: + cluster: cluster1 + dc: dc1 + +.. note:: For IPv6 to work, both scylla Prometheus address and node_exporter's `--web.listen-address` should be set to listen to an IPv6 address. + + +For general node information (disk, network, etc.) Scylla Monitoring Stack uses the ``node_exporter`` agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a ``node_exporter`` running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the ``node_exporter`` +targets configuration file by creating an additional file and passing it with the ``-n`` flag. + +.. note:: + By default, there is no need to create ``node_exporter_server.yml``. Prometheus will use the same targets it uses for + Scylla and will assume you have a ``node_exporter`` running on each Scylla server. + + +If needed, you can set your own target file instead of the default ``prometheus/scylla_servers.yml``, using the ``-s`` for Scylla target files. + +For example: + +.. code-block:: yaml + + ./start-all.sh -s my_scylla_server.yml -d prometheus_data + + +Mark the different Data Centers with Labels. + +As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers. + +You can use the ``genconfig.py`` script to generate the server file. For example: + +.. code-block:: yaml + + ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4 + +This will generate a server file for four servers in two datacenters server ``192.168.0.1`` and ``192.168.0.2`` in dc1 and ``192.168.0.3`` and ``192.168.0.4`` in dc2. + +OR + +The ``genconfig.py`` script can also use ``nodetool status`` to generate the server file using the ``-NS`` flag. + +.. code-block:: yaml + + nodetool status | ./genconfig.py -NS + + +2. Connect to `Scylla Manager`_ by creating ``prometheus/scylla_manager_servers.yml`` +If you are using Scylla Manager, you should set its IP and port in this file. + +You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: ``prometheus/scylla_manager_servers.example.yml`` for an example. + +.. _`Scylla Manager`: https://scylladb.github.io/scylla-manager/ + +For example if `Scylla Manager` host IP is `172.17.0.7` ``prometheus/scylla_manager_servers.yml`` would look like: + +.. code-block:: yaml + + # List Scylla Manager end points + + - targets: + - 172.17.0.7:5090 + +Note that you do not need to add labels to the Scylla Manager targets. + +Configure Scylla nodes using Scylla-Manager Consul API +...................................................... + +Scylla Manager 2.0 has a Consul_ like API. + +.. _Consul: https://www.consul.io/ + + +When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the `-L` flag. + +For example: + +.. code-block:: yaml + + ./start-all.sh -L 10.10.0.1 + + +.. note:: + If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address + will be available from within the container. + +Connecting Scylla-Monitoring to ScyllaDB +........................................ + +Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See `Scylla Authorization`_) you should assign a user and password for the Scylla-Grafana connection. + +.. _`Scylla Authorization`: https://docs.scylladb.com/operating-scylla/security/enable-authorization/ + + +You can limit the user to read only, currently it only read table from the system keyspace. + +You can set a user and password from a file or environment variables. + +If the environment variables **SCYLLA_USER** and **SCYLLA_PSSWD** are set, they will be used. + +To set the user and password from a file, edit `grafana/datasource.scylla.yml`. Uncomment the **secureJsonData** part and set the user and password. + +.. note:: It is best to use a dedicated user and password with limited privileges. + + +Use an external directory for the Prometheus data directory +........................................................... + +The ``-d`` flag, places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +If the directory provided does not exist, the ``start-all.sh`` script will create it. Note that you should avoid running docker as root, the ``start-all.sh`` script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example ``/prometheus-data``. + +In that case, you need to create the directory before calling ``start-all.sh`` and make sure it has the right permissions for the user running the command. + +Add Additional Prometheus Targets +.................................... +There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling ``start-all.sh``. +To add your targets you would need to edit the template file before calling ``start-all.sh``. + +The template file is either ``prometheus/prometheus.yml.template`` if Prometheus reads the Scylla target from file, or ``prometheus/prometheus.consul.yml.template`` +if Prometheus gets Scylla targets from the manager Consul API. + +You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000. + + +.. code-block:: yaml + + - job_name: 'myservice' + # Override the global default and scrape targets from this job every 5 seconds. + scrape_interval: 5s + static_configs: + - targets: + - 17.0.0.1:7000 + + + + +Start and Stop Scylla Monitoring Stack +-------------------------------------- + +Start +..... + +.. code-block:: yaml + + ./start-all.sh -d prometheus_data + + +Stop +.... + +.. code-block:: yaml + + ./kill-all.sh + + +Start a Specific Scylla Monitoring Stack Version +................................................. + +By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version. + +You can specify specific scylla version with the ``-v`` flag and Scylla Manager version with ``-M`` flag. + +Multiple versions are supported. For example: + +.. code-block:: sh + + ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data + +will load the dashboards for Scylla Enterprise versions ``2020.1`` and ``2019.1`` and the dashboard for Scylla Manager ``2.1`` + + +Accessing the `localhost` +......................... + +The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example: + +.. code-block:: sh + + ./start-all.sh -l -d prometheus-data + +Configure rsyslog on each Scylla node +..................................... +generates metrics and alerts from logs. To get full functionality, you should use rsyslog_. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog_, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service. + +.. _rsyslog: https://www.rsyslog.com/ + + + +**Prerequisite**, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction_. + +.. _instruction: https://www.rsyslog.com/doc/v8-stable/installation/index.html + +Add scylla's rsyslog configuration file. Add the file: ``/etc/rsyslog.d/scylla.conf``. + +If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like + +.. code-block:: sh + + if $programname == 'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format + +Restart rsyslog for the configuration to take effect. + +.. code-block:: sh + + + systemctl restart rsyslog + +View Grafana Dashboards +----------------------- + +Point your browser to ``your-server-ip:3000`` +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the ``-a`` option. diff --git a/stable/_sources/install/start-all.rst.txt b/stable/_sources/install/start-all.rst.txt new file mode 100644 index 000000000..f270d092f --- /dev/null +++ b/stable/_sources/install/start-all.rst.txt @@ -0,0 +1,107 @@ +The start-all.sh Command +======================== + +Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the `start-all.sh` command. + +The `start-all.sh` script is a small utility that sets the dashboards and starts the containers with the appropriate configuration. + +General Options +--------------- + +**-h** Help, Print the help, and exit. + +**--version** print the current Scylla-Monitoring stack version, and exit. + +**-l** local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container's local IP address. +You cannot use port mapping when using the ``-l`` flag + +**-A bind-to-ip-address** Bind the listening-address to an explicit IP address. + +**-D encapsulate docker param** Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D "--net=network_name". + +**--auto-restart** When set, Docker will automatically restart all the services inside the containers in case of a failure. + +**--compose** This is an experimental option. When set, it initiates a two-stage process. Firstly, a ``docker-compose.yml`` file is created along with an ``.env`` file. Following this, the script executes ``docker-compose up``. Please note that having docker-compose is a prerequisite. + +Grafana Related Commands +------------------------ + +**-G path/to/grafana data-dir** Use an external directory for the Grafana database. +This flag places the Grafana data directory outside of its container and, by doing that, makes it persistent. +This is only important if you are creating your own dashboards using the Grafana GUI and wish to keep them. +If not used, each run of the containers will clear all of Grafana's information. + +**-v comma-separated versions** Each Scylla version comes with its own set of dashboards. By default, Grafana starts with the two latest versions. The ``-v`` flag allows specifying a specific version or versions. + +**-M scylla-manager version** Each Scylla-Manager version has its own dashboard. By default, Grafana starts with the latest Scylla Manager version.  The ``-M`` flag allows specifying a specific version. + +**-j dashboard** Allows adding dashboards to Grafana. Multiple parameters are supported. + +**-c Grafana environment variable** Use this parameter to override Grafana's configuration settings. The ``-c`` flag allows adding an environment variable to Grafana and, by doing so, alters its configuration. + +**-g Grafana port** Override the default Grafana port. This is done using port mapping. Note that port mapping does not work when using the host network. + +**-a admin password** Allows specifying the admin password. + +**-Q Grafana anonymous role** By default, anonymous users have admin privileges. That means they can create and edit dashboards. The ``-Q`` flag changes this behavior by setting the role privileges to one of Admin, Editor, or Viewer. + +Grafana LDAP support +^^^^^^^^^^^^^^^^^^^^ +Grafana supports LDAP_ for authentication and authorization. + +.. _LDAP: https://grafana.com/docs/grafana/latest/auth/ldap/ + +Use the ``-P`` flag to supply an LDAP configuration file. + +**-P ldap-config-file** + +Prometheus Related Commands +--------------------------- + +**-d path/to/data-dir** Use an external directory for the Prometheus data directory. +This flag places the Prometheus data directory outside of its container and by doing that makes it persistent. + +.. note:: Specifying an external directory is important for systems in production. Without it, + every restart of the monitoring stack will result in metrics lost. + +**-p prometheus-port** Override the default Prometheus port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-b command-line options** Allow adding command-line options that will be passed to the Prometheus server. + +**-s scylla-target-file** Specify the location of the Scylla target files. This file contains the IP addresses of the Scylla nodes. + +**-n node-target-file** Scylla Monitoring Stack collects OS metrics (Disk, network, etc.) using an agent called node_exporter. By default, Scylla Monitoring Stack assumes that there is a node_exporter running beside each Scylla node, for situations that this is not the case, for example, Scylla runs inside a container and the relevant metrics are of the host machine, it is possible to specify a target file for the node_exporter agents.  + +**-N manager target file** Specify the location of the Scylla Manager target file. + +**-R prometheus-alert-file** By default Prometheus alert rules are found in ``prometheus.rules.yml`` in the ``prometheus`` directory. The ``-R`` flag allows specifying a different location. + +**-L manager-address** Using Scylla Manager **Consul** API to resolve the servers' IP address. When using this option, Prometheus will ignore the target files even if they are explicitly passed in the command line. + +**--evaluation-interval duration** Override the default recording rules evaluation-interval. + +**--no-cas** An optimization for users who do not use cas, Prometheus will drop all cas related metrics while scrapping +**--no-cdc** An optimization for users who do not use cdc, Prometheus will drop all cdc related metrics while scrapping + +Prometheus Retention Period +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Prometheus retention period is set for two weeks by default. A common request is how to set it to something else. +It is also an opportunity to demonstrate how to set a Prometheus specific command line option. +Prometheus storage configuration is covered here_. + +.. _here: https://prometheus.io/docs/prometheus/latest/storage/#operational-aspects + +For example to set the retention time to 30 days add ``-b "--storage.tsdb.retention.time=30d"`` to the ``start-all.sh`` command + +Alert Manager +------------- + +The Alertmanager handles the alerts and takes the following parameters: + +**-m alertmanager-port** Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network. + +**-r alert-manager-config** By default, the Alertmanager takes its configuration from ``rule_config.yml`` in the ``prometheus`` directory. The ``-r`` flag overrides it to another file.prometheus + +**-C alertmanager-commands** Allows adding an arbitrary command line to the alertmanager container starting command. diff --git a/stable/_sources/install/thanos.rst.txt b/stable/_sources/install/thanos.rst.txt new file mode 100644 index 000000000..dcb16bcf9 --- /dev/null +++ b/stable/_sources/install/thanos.rst.txt @@ -0,0 +1,83 @@ +Using Thanos as Data Source With Scylla Monitoring Stack +======================================================== + +Scylla-Monitoring uses `Prometheus `_ for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +`Thanos `_  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as: + +* High-availability. +* Horizontal scaling. +* Backup. + +The benefit is that with Thanos' flexible design you can use some or all of these features depending on your requirements. + +The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus. + + +Using Thanos As a Prometheus Aggregator +--------------------------------------- +There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC. + +Prometheus Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will assume you have two Prometheus servers running. + +1. If you are running Prometheus using a container, you should use an **external** data directory, make sure it is reachable by other containers. +2. You will need to add the `--web.enable-lifecycle` flag to your Prometheus command-line option. + +Thanos sidecar +^^^^^^^^^^^^^^^ + +The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like: + +.. code-block:: shell + +   docker run -d \ + -v /path/to/prom/dir:/data/prom:z \ +   -i --name sidecar thanosio/thanos \ + sidecar \ + --grpc-address=0.0.0.0:10911 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10912 \ + --http-grace-period=1s \ + --prometheus.url=http://prometheus-ip:9090 \ + --tsdb.path=/data/prom \ + -p 10912:10912 \ + -p 10911:10911 + +After you run the sidecar you should be able to reach it from your browser at: ``http://{ip}:10912`` + +Thanos query +^^^^^^^^^^^^ +Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: `ip1` and `ip2`, +Start the container by running: + +.. code-block:: shell + +   docker run -d \ + --name thanos -- thanosio/thanos \ + query \ + --debug.name=query0 \ + --log.level=debug \ + --grpc-address=0.0.0.0:10903 \ + --grpc-grace-period=1s \ + --http-address=0.0.0.0:10904 \ + --http-grace-period=1s \ + --query.replica-label=prometheus \ + --store={ip1}:10911 --store={ip2}:10911 + +After you run Thanos query, you can connect to its HTTP server, in the above example at ``http://{ip}:10903`` + +Update Scylla Data source +^^^^^^^^^^^^^^^^^^^^^^^^^ +The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable). + +The file you edit is a template file that replaces the file Grafana uses, next time you start. + +Restart the Scylla Monitoring Stack it should now use Thanos. + diff --git a/stable/_sources/intro.rst.txt b/stable/_sources/intro.rst.txt new file mode 100644 index 000000000..78481f6c3 --- /dev/null +++ b/stable/_sources/intro.rst.txt @@ -0,0 +1,47 @@ +========================== +ScyllaDB Monitoring Stack +========================== + +.. include:: /common/monitor-description.rst + + +.. image:: monitor.png + :width: 400pt + +The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers: + +* `prometheus` - Collects and stores metrics +* `grafan-loki` - Parses logs and generates metrics and alerts +* `alertmanager` - Handles alerts +* `grafana` - Dashboards server + +A few optional components are used for additional services + +* `grafana-image-renderer` - Allows you to download a dashboard as an image. +* `Thanos sidecar` - Allows a centralized Thanos server to read from the local Prometheus server. + +High Level Architecture +----------------------- + +.. image:: monitoring_stack.png + :width: 400pt + +We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the `node_exporter` agent that runs on the ScyllaDB server. + +We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers. + +The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack. + +We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL. + + +**Choose a topic to get started**: + +* :doc:`User Guide ` +* :doc:`Download and Install ` +* :doc:`Procedures ` +* :doc:`Troubleshooting ` +* :doc:`Reference ` +* `ScyllaDB Monitoring Stack lesson `_ on ScyllaDB University + diff --git a/stable/_sources/procedures/alerts/alerting.rst.txt b/stable/_sources/procedures/alerts/alerting.rst.txt new file mode 100644 index 000000000..d196123bc --- /dev/null +++ b/stable/_sources/procedures/alerts/alerting.rst.txt @@ -0,0 +1,114 @@ +Alerting +======== + +Alerts are a Prometheus enhancement to notify that something is wrong in the system. + +You can read more about `Prometheus alerting here`_ + +.. _`Prometheus alerting here` : https://prometheus.io/docs/alerting/overview/ + +By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack. + +In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems. + +The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard. + +.. image:: monitoring_stack.png + +Prometheus Alerts +^^^^^^^^^^^^^^^^^ +The Prometheus alerts are defined in files placed under `prometheus/prom_rules/`. Prometheus will load any file that ends with `yml` or `yaml`. + +Each Prometheus alert consists of: + +- Name +- What happened +- For how long +- What to report + +For example, let us look at the `InstanceDown` alert that comes by default as part of Scylla-Monitoring. + +.. code-block:: yaml + + - alert: InstanceDown + expr: up == 0 + for: 60s + labels: + severity: "error" + annotations: + description: '{{ $labels.instance }} has been down for more than 30 seconds.' + summary: Instance {{ $labels.instance }} down + +The **expr** is a legal Prometheus expression, in this case, the **up** metric is equal to **0**. + +The **for** set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent. + +The **labels** part holds additional labels that will be added to the alert, in the example, the **severity** label will be set to **error**. + +**annotations** are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems. + +Alerts severity +--------------- + +Prometheus uses the following severities from low to high: **info**, **warn**, **error**, **critical**. + +The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the **error** alert for disk-full is firing, it silences the **warn** alert. + +When adding your own alerts, you can use the severities to signal the action's importance, for example **critical** would be a pager-duty, while an **error** will be an email. + +Adding Alerts +---------------- + +Add your own alerts in a separate file with a **yml** or **yaml** extension. Making it easier during upgrade. + +Modifying Alerts +---------------- + +It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade. + +Alertmanager +^^^^^^^^^^^^ + +The `Alertmanager`_ gets the alerts from the Prometheus server responsible for duplicating, grouping and routing. + +.. _`Alertmanager` : https://prometheus.io/docs/alerting/alertmanager/ + +The Alertmanager configuration is found in `rule_config.yml` file that is located in the `prometheus` directory. +The configuration consists of three parts: + +- Routes: Represent a routing tree, the most specific rule, wins +- Inhibition: Mute an alert, based on another alert +- Receiver: Send a notification via email, sluck, etc’ + +Check the Alertmanager documentation for details on how to specify a specific receiver. + +In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the **overview** dashboard. + +Tips When Adding an Alert +^^^^^^^^^^^^^^^^^^^^^^^^^ + +**It's worse having an alert that does not work, than not having an alert at all** + +There are multiple ways you can use to make sure your alert is set correctly: + +- Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic. +- Force the alert to be active by reducing the limits or the duration. +- When possible simulate the actual scenario and see that the alert works as expected. + +For example, low available disk space. + +Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation. + +Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files. + +Starting with a simple working expression helps you bisect problems. + diff --git a/stable/_sources/procedures/alerts/index.rst.txt b/stable/_sources/procedures/alerts/index.rst.txt new file mode 100644 index 000000000..2c0f4b795 --- /dev/null +++ b/stable/_sources/procedures/alerts/index.rst.txt @@ -0,0 +1,15 @@ +===================================== +Scylla Monitoring Stack Alert Manager +===================================== + +.. toctree:: + :maxdepth: 2 + :hidden: + + Alerting + + +Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin: + +* :doc:`Alerting ` diff --git a/stable/_sources/procedures/datadog/index.rst.txt b/stable/_sources/procedures/datadog/index.rst.txt new file mode 100644 index 000000000..7bcc4e9b7 --- /dev/null +++ b/stable/_sources/procedures/datadog/index.rst.txt @@ -0,0 +1,68 @@ +===================================== +Scylla Monitoring Datadog Integration +===================================== + +The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of: + +1. Installing and configuring the Datadog Agent. +2. Add Datadog recording rules. +3. Loading Scylla dashboard to Datadog. +4. Optionally load Monitor (Alerts). + +.. note:: Scylla Cloud users, use and update the proper configuration file. + +Install And configure the Datadog Agent +======================================= + +Start by following `Installation `_ guide. The datadog agent should run on a machine that can reach the Prometheus server. + +Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + +Scylla Cloud Users +^^^^^^^^^^^^^^^^^^ +Scylla Cloud users, download the configuration file :download:`conf.yaml ` move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml + + +Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN). + +Other Scylla Users +^^^^^^^^^^^^^^^^^^ +Other Scylla users, download the configuration file :download:`conf.yaml ` and replace the ip address of the Prometheus server. + + +Post configuration +^^^^^^^^^^^^^^^^^^ +Restart the agent based on your installation. Scylla metrics should be visible in Datadog. + + +.. note:: By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~"1" with dd=~"1|2" + +Add datadog recording rules +=========================== +Non Scylla Cloud users, download the rules configuration file :download:`datadog.rules.yml ` if you need per-shard metrics, download :download:`datadog.rules-with-shards.yml ` and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed. + +Cloud users, skip this step, it's been take care for by the cloud. + +Upload the Dashboard +==================== +Download the dashboard file :download:`dashboard.json `. +Create a new dashboard in Datadog and import the json file you downloaded. + +Using the Dashboard +=================== +We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users. + +.. image:: datadog.png + +The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs. + +.. note:: Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first. + +Adding Monitor +============== +Alerts in Datadog called Monitor. Download the monitor file :download:`monitor.json `. Go to the Monitor section in datadog and import the json. diff --git a/stable/_sources/procedures/index.rst.txt b/stable/_sources/procedures/index.rst.txt new file mode 100644 index 000000000..76a24002a --- /dev/null +++ b/stable/_sources/procedures/index.rst.txt @@ -0,0 +1,19 @@ +========================================= +ScyllaDB Monitoring Stack Procedures +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Datadog Integration + Alert Manager + Adding and Modifying Dashboards + Upgrade Guides + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Alert Manager ` +* :doc:`Adding and Modifying Dashboards ` +* :doc:`Upgrade Guides ` diff --git a/stable/_sources/procedures/updating-dashboard.rst.txt b/stable/_sources/procedures/updating-dashboard.rst.txt new file mode 100644 index 000000000..e67833dee --- /dev/null +++ b/stable/_sources/procedures/updating-dashboard.rst.txt @@ -0,0 +1,299 @@ +******************************* +Adding and Modifying Dashboards +******************************* + +This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack. + +It covers dashboard templates and how to modify them. + +.. contents:: + :depth: 2 + :local: + + +General Limitations +################### +Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below. + +Consistency Between Restarts +**************************** +By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana. + +Consistency Between Upgrades +**************************** +As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost. + +.. note::  You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided. + +At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does. + + +Using Templated Dashboards +########################## +Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable. + +Each element in the dashboard file (Each JSON object) contains all of its attributes and values. + +For example a typical graph panel would look like this: + +.. code-block:: json + + { + "aliasColors": {}, + "bars": false, + "datasource": "prometheus", + "editable": true, + "error": false, + "fill": 0, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "gridPos": { + "h": 6, + "w": 10, + "x": 0, + "y": 4 + }, + "id": 2, + "isNew": true, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": false, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + {} + ], + "span": 5, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A", + "step": 1 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Available Disk Size", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "transparent": false, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": 101, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + +As you can imagine, most panels would have similar values. + +To reduce the redundancy of the Grafana JSON format, we added dashboard templates. + +The Template Class System +*************************** + +The Scylla Monitoring Stack dashboard templates use a ``class`` attribute that can be added to any JSON object in a template file. +The different classes are defined in a file. + +The ``class`` system resembles CSS classes. It is hierarchical, so a ``class`` type definition can have a ``class`` attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes. + +In the template file, you can also add or override attributes. + +The Scylla Monitor generation script, uses the `types.json` file and a template file and creates a dashboard. + +When generating dashboards, each class will be replaced by its definition. + +For example, a row in the `type.json` is defined as: + +.. code-block:: json + + { + "base_row": { + "collapse": false, + "editable": true + }, + "row": { + "class": "base_row", + "height": "250px" + } + } + +Will be used like in a template: + +.. code-block:: json + + { + "class": "row", + "height": "150px", + "panels": [ + ] + } + +And the output will be: + +.. code-block:: json + + { + "class": "row", + "collapse": false, + "editable": true, + "height": "150px", + "panels": [ + + ] + } + + +We can see that the template added the ``panels`` attribute and that it overrides the ``height`` attribute. + + +Panel Example +************* + +Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size. + +.. code-block:: json + + { + "class": "row", + "panels": [ + { + "class": "bytes_panel", + "span": 3, + "targets": [ + { + "expr": "sum(node_filesystem_avail) by (instance)", + "intervalFactor": 1, + "legendFormat": "", + "metric": "", + "refId": "A", + "step": 1 + } + ], + "title": "Available Disk Size" + } + ] + } + +In the example, the `bytes_panel` class generates a graph with bytes as units (that would mean that your +`Y` axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc'). + +You can also see that the `span` attribute is overridden to set the panel size. + +To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally. + +Grafana Formats and Layouts +*************************** + +The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case. + +Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width). + +The server should be backward compatible, but we've found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand. + +To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position. + +The panel's height will be taken from their row. The `span` attribute is still supported as is row height. + +You can use the `gridPos` attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes. + +`gridPos` has the following attributes: + +.. code-block:: json + + { + "x": 0, + "y": 0, + "w": 24, + "h": 4 + } + +When using Scylla's template you don't need to supply all of the attributes, so for example to specify that a row is 2 units high you can use: + +.. code-block:: json + + { + "gridPos": { + "h": 2 + } + } + +Generating the dashboards from templates (generate-dashboards.sh) +***************************************************************** + +Prerequisite +============ +Python 2.7 + + +`make_dashboards.py` is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the `-r` flag). + +Use the -h flag to get help information. + +You can use the `make_dashboards.py` to generate a single dashboard, but it's usually easier to use the +`generate-dashboards.sh` wrapper. + +When you're done changing an existing dashboard template, run the `generate-dashboards.sh` with the current version, +to replace your existing dashboards. + +For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run: + +``.\generate-dashboards.sh -v 2020.1`` + +.. note:: generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard. + + +Validation +********** +After making changes to a template, run the ``generate_generate-dashboards.sh`` and make sure that it ran without any errors. + +Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your ``expr`` attribute. diff --git a/stable/_sources/reference/index.rst.txt b/stable/_sources/reference/index.rst.txt new file mode 100644 index 000000000..df1458cd4 --- /dev/null +++ b/stable/_sources/reference/index.rst.txt @@ -0,0 +1,17 @@ +========================================= +Scylla Monitoring Stack Reference Guide +========================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + + Support Matrix + Interfaces + +There are several reference guides available which give additional information. Choose a topic to begin: + +* :doc:`Support Matrix ` +* :doc:`Interfaces ` + diff --git a/stable/_sources/reference/matrix.rst.txt b/stable/_sources/reference/matrix.rst.txt new file mode 100644 index 000000000..c5e722bbf --- /dev/null +++ b/stable/_sources/reference/matrix.rst.txt @@ -0,0 +1,160 @@ + +Scylla Monitoring Stack Support Matrix +====================================== + +The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager. + + +.. list-table:: + :widths: 25 25 25 25 25 + :header-rows: 1 + + * - Scylla Monitoring Stack Version + - Scylla Open Source Version + - Scylla Enterprise Version + - Node_exporter[1] Version + - Scylla Manager Version + * - 4.6 + - 5.2, 5.4 + - 2021.1, 2022.1, 2022.2, 2023.1, 2024.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4.5 + - 5.0,5.1,5.2,5.4 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1, 3.2 + * - 4.4 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2, 2023.1 + - 1.4.1 + - 3.0, 3.1 + * - 4.3 + - 5.0,5.1,5.2 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.2 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 1.4.1 + - 2.5, 2.6, 3.0 + * - 4.1 + - 4.5,4.6,5.0,5.1 + - 2020.1, 2021.1, 2022.1, 2022.2 + - 0.17 + - 2.5, 2.6, 3.0 + * - 4.0 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6, 3.0 + * - 3.11 + - 4.3, 4.4, 4.5, 4.6, 5.0 + - 2020.1, 2021.1, 2022.2 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.10 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5, 2.6 + * - 3.9 + - 4.3, 4.4, 4.5, 4.6 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.8 + - 4.3, 4.4, 4.5 + - 2020.1, 2021.1 + - 0.17 + - 2.3, 2.4, 2.5 + * - 3.7 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3 + * - 3.6.3 + - 4.2, 4.3, 4.4 + - 2019.1, 2020.1, 2021.1 + - 0.17 + - 2.2, 2.3, 2.1 + * - 3.6 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2, 2.3 + * - 3.6.1 + - 4.1, 4.2, 4.3 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.6.1 + - 4.1, 4.2, 4.3, 4.4 + - 2019.1, 2020.1 + - 0.17 + - 2.1, 2.2 + * - 3.5 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1, 2.2 + * - 3.4.3 + - 3.3, 4.0, 4.1, 4.2 + - 2019.1, 2020.1 + - 0.17 + - 2.0, 2.1 + * - 3.4 + - 3.3, 4.0, 4.1 + - 2018.1, 2019.1 + - 0.17 + - 2.0, 2.1 + * - 3.3 + - 3.1, 3.2, 3.3, 4.0 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0, 2.1 + * - 3.2 + - 3.1, 3.2, 3.3 + - 2018.1, 2019.1 + - 0.17 + - 1.4, 2.0 + * - 3.1 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4, 2.0 + * - 3.0 + - 2.3, 3.0, 3.1, 3.2 + - 2018.1, 2019.1 + - 0.17 + - 1.3, 1.4 + * - 2.4 + - 2.3, 3.0, 3.1 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3, 1.4 + * - 2.3 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.2 + - 2.3, 3.0 + - 2018.1, 2019.1 + - 0.14, 0.17 + - 1.3 + * - 2.1 + - 2.3, 3.0 + - 2018.1 + - 0.14, 0.17 + - 1.3 + + + +[1] `Node_exporter `_ is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus diff --git a/stable/_sources/reference/monitoring-apis.rst.txt b/stable/_sources/reference/monitoring-apis.rst.txt new file mode 100644 index 000000000..36ba48465 --- /dev/null +++ b/stable/_sources/reference/monitoring-apis.rst.txt @@ -0,0 +1,27 @@ + +Scylla Monitoring Stack Interfaces +================================== + +Scylla exposes two interfaces for online monitoring, as described below + +.. _API_Prometheus: + +Prometheus API +-------------- +By default, Scylla listens on port 9180 for `Prometheus `_ requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with :code:`your-ip:9180` + +For more information on monitoring Scylla with Prometheus see :doc:`Scylla Monitoring Stack <../install/monitoring-stack>`. + +You can change the Prometheus listening address and port in scylla.yaml file + +.. code-block:: yaml + + # prometheus port + # By default, Scylla opens prometheus API port on port 9180 + # setting the port to 0 will disable the prometheus API. + prometheus_port: 9180 + # + # prometheus address + # By default, Scylla binds all interfaces to the prometheus API + # It is possible to restrict the listening address to a specific one + prometheus_address: 0.0.0.0 diff --git a/stable/_sources/troubleshooting/index.rst.txt b/stable/_sources/troubleshooting/index.rst.txt new file mode 100644 index 000000000..fa1b25a10 --- /dev/null +++ b/stable/_sources/troubleshooting/index.rst.txt @@ -0,0 +1,16 @@ +================================================= +Troubleshooting Guide for Scylla Monitoring Stack +================================================= + +.. toctree:: + :maxdepth: 2 + :hidden: + + Troubleshooting + Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration + +Choose a topic to begin: + +* :doc:`Troubleshooting ` +* `Troubleshooting Guide for Scylla Manager and Scylla Monitor Integration `_ +* You can ask questions and discuss the ScyllaDB Monitoring Stack in the `ScyllaDB community forum `_ and on the `Slack channel `_. \ No newline at end of file diff --git a/stable/_sources/troubleshooting/monitor-troubleshoot.rst.txt b/stable/_sources/troubleshooting/monitor-troubleshoot.rst.txt new file mode 100644 index 000000000..c5f8de960 --- /dev/null +++ b/stable/_sources/troubleshooting/monitor-troubleshoot.rst.txt @@ -0,0 +1,246 @@ +Troubleshoot Scylla Monitoring Stack +==================================== + + +This document describes steps that need to be done to troubleshoot monitoring problems when using `Grafana/Prometheus`_ monitoring tool. + +.. _`Grafana/Prometheus`: ../monitoring-apis + +Problem +~~~~~~~ + +Scylla-Manager 2.2 with Duplicate information +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports: + +* For Manager server: from 56090 to 5090 +* For Manager Agent: from 56090 to 5090 + +For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from **both** Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2 + + + +However, if you configure ``scylla_manager_server.yml`` file with the new port, Scylla-Manager dashboard will report all metrics twice. + +The easiest way around this is to edit ``prometheus/prometheus.yml.template`` and remove the ``scylla_manager1`` job. + +Note that for this change to take effect you need to run ``kill-all.sh`` followed by ``start-all.sh``. + +A Container Fails To Start +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When running ``./start-all.sh`` a container can fail to start. For example you can see the following error message: + +.. code-block:: shell + + Wait for Prometheus container to start........Error: Prometheus container failed to start + + +Should this happen, check the Docker logs for more information. + +.. code-block:: shell + + docker logs aprom + +Usually the reason for the failure is described in the logs. + +Files And Directory Permissions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +.. note:: + + Avoid running Docker containers as root. + +The preferred way of running the container is using a non root user. +See the `monitoring`_ Docker post-installation section. + +.. _`monitoring`: ../monitoring-stack#docker-post-installation + + +If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions. + +.. note:: + + If you started the container in the past as root, you may need to change the directory and files ownership and permissions. + +For example if your Prometheus data directory is ``/prom-data`` and you are using ``centos`` user + +.. code-block:: shell + + ls -la /|grep prom-data + + drwxr-xr-x 2 root root 4096 Jun 25 17:51 prom-data + + sudo chown -R centos:centos /prom-data + + ls -la /|grep prom-data + + drwxr-xr-x 2 centos centos 4096 Jun 25 17:51 prom-data + + + +No Data Points +^^^^^^^^^^^^^^ + +``No data points`` on all data charts. + +Solution +........ + +If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity. + +1. Login to the Prometheus console: + +2. Point your browser to ``http://{ip}:9090``, where {ip} is the Prometheus IP address. + +3. Go to the target tabs: ``http://{ip}:9090/targets`` and see if any of the targets are down and if there are any error messages. + + * Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the ``-l`` flag to enable local network stack. + + * Confirm Prometheus is pointing to the wrong target. Check your ``prometheus/scylla_servers.yml``. Make sure Prometheus is pulling data from the Scylla server. + + * Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with ``-v`` flag. + +For example: + +.. code-block:: shell + + ./start-all.sh -v 3.1 + +More on start-all.sh `options`_. + +.. _`options`: ../monitoring-stack/ + + +Grafana Chart Shows Error (!) Sign +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Run this procedure on the Scylla Monitoring Stack server. + +If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus. + +Solution +......... + +On the Scylla Monitoring Stack server: + +1. Check Prometheus is running using ``docker ps``. + +* If it is not running check the ``prometheus.yml`` for errors. + +For example: + +.. code-block:: shell + + CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES + 41bd3db26240 monitor "/docker-entrypoin..." 25 seconds ago Up 23 seconds 7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp monitor + +* If it is running, go to "Data Source" in the Grafana GUI, choose Prometheus and click Test Connection. + +Grafana Shows Server Level Metrics, but not Scylla Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers. + +Solution +......... + +* Use ``curl :9180/metrics`` to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls. + +For example + +.. code-block:: shell + + curl 172.17.0.2:9180/metrics + +Grafana Shows Scylla Metrics, but not Server Level Metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from ``node_exporter``. + +Solution +......... + +1. Make sure that ``node_exporter`` is running on each Scylla server (by login to the machine and running ``ps -ef |gre node_exporter``). ``node_exporter`` is installed with ``scylla_setup``. +to check that ``node_exporter`` is installed, run ``node_exporter --version``, If it is not, make sure to install and run it. + +2. If it is running, use ``curl http://:9100/metrics`` (where is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls. + +Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1 +................................................................................ + +While upgrading, you need to upgrade the ``node_exporter`` from version 0.14 to 0.17. + +If the node_exporter service is not starting it may need to be updated manually. + +Check the node_exporter version ``node_exporter --version`` if it shows 0.14 check the node_exporter section +in the `upgrade guide`_. + +.. _`upgrade guide`: /upgrade/upgrade-opensource/upgrade-guide-from-2.3-to-3.0/ + +Latencies Graphs Are empty +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus' recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards. + +During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present. + +Scylla Monitoring versions 4.0 and newer rely only on recording rules. + +If only the latency graphs are missing, it is because of missing recording rules. + +This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation. + +If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in `install without docker`_. + +.. _`install without docker`: /install/monitor-without-docker#install-prometheus + +Reducing the total number of metrics +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node. + +Remove interrupts from node_exporter +.................................... + +By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +`/etc/sysconfig/scylla-node-exporter` and remove --collector.interrupts from it. + +Working with Wireshark +^^^^^^^^^^^^^^^^^^^^^^^ + +No metrics shown in the Scylla Monitoring Stack. + +1. Install `wireshark`_ + +.. _`wireshark`: https://www.wireshark.org/#download + +2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the ``tshark`` command. +``tshark -i -f "dst port 9180"`` + +For example: + +.. code-block:: shell + + tshark -i eth0 -f "dst port 9180" + +Capture from Scylla node towards Scylla Monitoring Stack server. + + +In this example, Scylla is running. + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210 + +In this example, Scylla is not running + +.. code-block:: shell + + Monitor ip Scylla node ip + 199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128 diff --git a/stable/_sources/upgrade/index.rst.txt b/stable/_sources/upgrade/index.rst.txt new file mode 100644 index 000000000..27fcf7beb --- /dev/null +++ b/stable/_sources/upgrade/index.rst.txt @@ -0,0 +1,45 @@ +================================ +Upgrade Scylla Monitoring Stack +================================ + + +.. toctree:: + :titlesonly: + :hidden: + + Monitoring 4.x to 4.y + Monitoring 3.x to 4.y + Monitoring 3.x to 3.y + Monitoring 2.x to 3.y + Monitoring 2.x to 2.y + Monitoring 1.x to 2.x + +.. raw:: html + + +
                                  +
                                  +
                                  +
                                  Upgrade Scylla Open Source
                                  +
                                  +
                                  + +Procedures for upgrading the Scylla Monitoring Stack. + +* :doc:`Upgrade Guide - Monitoring 4.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 4.y ` + +* :doc:`Upgrade Guide - Monitoring 3.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 3.y ` + +* :doc:`Upgrade Guide - Monitoring 2.x to 2.y ` + +* :doc:`Upgrade Guide - Monitoring 1.x to 2.x ` + +.. raw:: html + +
                                  +
                                  +
                                  diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt new file mode 100644 index 000000000..cf5bff5ad --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst.txt @@ -0,0 +1,100 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x + +Scylla monitoring stack uses `Prometheus `_ as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in **parallel**, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack. + +Upgrade Procedure +================= + +1. Upgrade to the latest 1.x version +------------------------------------ +Before starting the upgrade procedure, make sure you are running the `latest 1.x version `_ + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 2.x version from the `release `_ page. +#. Unzip it into a **different** directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data. +#. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the ``prometheus/`` directory: + + - scylla_servers.yml + - scylla_manager_servers.yml + - node_exporter_servers.yml + +#. Start the new monitoring stack. If you are using Docker, make sure you are using ``-g`` ``-p`` and ``-m`` to specify different ports than the old monitoring stack. For example: + +.. code-block:: bash + + ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path + +.. note:: + Make sure to use the ``-d`` option, letting Prometheus keep its data **outside** the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack. + +While the **old** monitoring stack keeps working, you can take the **new** stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack: + +.. code-block:: bash + + ./kill-all.sh -g 3001 -p 9091 -m 9094 + + +Validation +^^^^^^^^^^ +Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable. + +3. Alerting Rules +----------------- +Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken. + +4. Moving to Prometheus 2.x +--------------------------- +Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover `here `_. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work. + +Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus: + +a. Set the old system +^^^^^^^^^^^^^^^^^^^^^ +The following steps will stop the **old** monitoring stack from reading new metrics while exposing an API for the **new** monitoring stack to read historical metrics from. + +* In the **old** Prometheus `prometheus.yml.template` file, remove the ``alerting``, ``scrape_configs``, and ``rule_files`` sections, keeping only the ``external_labels`` section. +* Restart the **old** monitoring stack with, ``kill-all.sh`` followed by ``start-all.sh`` with command line flag ``-b "-web.listen-address=:9111"``. + +.. note:: + After this phase, the **old** monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the **new** stack + +b. Set the new system +^^^^^^^^^^^^^^^^^^^^^ +The following step will allow the **new** monitoring system to read historical metrics from the old system. + +* In the Prometheus `prometheus.yml.template` file add the following at the end: + +.. code-block:: bash + + remote_read: + - url: "http://{ip}:9111/api/v1/read" + +Where {ip} is the ip of the old system. + +* restart the **new** stack + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the `remote_read` from the new Prometheus configuration. + +Rollback +======== +In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system. + + +Related Links +============= + +* :doc:`Upgrade` +* `Prometheus Migration `_ diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt new file mode 100644 index 000000000..2500559ed --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst.txt @@ -0,0 +1,131 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1. + + + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 2.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip + unzip scylla-monitoring-2.y.zip + cd scylla-monitoring-scylla-monitoring-2.y/ + +Replace “y” with the new minor release number, for example, 2.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``node_exporter_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 2.x version that is currently running. + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 2.y version while testing. + +Move to version 2.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +Follow the instruction on how to kill the 2.y version when in testing mode. + +To kill the 2.x version containers, run: + +.. code-block:: bash + + ./kill-all.sh + +Start version 2.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-2.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 2.x +----------------------- + + +To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally. + +To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-2.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..45e51b738 --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,62 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x + +Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards' names and metrics. + +Upgrade Procedure +================= + +1. Validate node_exporter version +--------------------------------- + +Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running `node_exporter --version` on the machines running Scylla. + +If you are running an older version of `node_exporter` you can use the helper script `node_exporter_install --force` that shipped with Scylla to force upgrade. + +2. Install the new monitoring stack +----------------------------------- + +#. Download the 3.x version from the `release `_ page. +#. Unzip it into a **different** directory. +#. Copy the targets files from the old stack to the new one, located on the ``prometheus/`` sub-directory: + + - scylla_servers.yml (for example ``cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/``) + - scylla_manager_servers.yml + + .. note:: + The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start. + +#. Stop the old monitoring stack + + .. code-block:: bash + + ./kill-all.sh + +#. Start the new monitoring stack + + .. code-block:: bash + + ./start-all.sh -d /prometheus-data-path + +Validate the upgrade +-------------------- +You should be able to see the graphs on the new stack. Make sure you see the graphs' history. + +Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase. + +Rollback +======== +To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it. + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt new file mode 100644 index 000000000..cff1c4e5a --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst.txt @@ -0,0 +1,137 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 3.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip + unzip scylla-monitoring-3.y.zip + cd scylla-monitoring-scylla-monitoring-3.y/ + +Replace “y” with the new minor release number, for example, 3.0.1.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +Starting from Scylla-Monitoring version 2.2, you can run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running. + +Killing the new 3.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 3.y version while testing. + +Move to version 3.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 3.y Monitoring stack in testing mode`_ +in the previous section + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 3.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-3.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 3.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* :doc:`Upgrade` diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..dfaba75ad --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,280 @@ +============================================================== +Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y +============================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format. + +Install 4.y (The new version) +----------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip + unzip scylla-monitoring-4.y.zip + cd scylla-monitoring-scylla-monitoring-4.y/ + +Replace “y” with the new minor and patch release number, for example, 4.0.0.zip + +Setting the server's files +-------------------------- + +Copy the ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the new version is running the correct version +------------------------------------------------------- + +run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + +Running in test mode +==================== + +This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section. + + +Running second monitoring stack +-------------------------------- + +We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack). + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` and check the Grafana dashboard. + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 3.x version that is currently running! + +Killing the new 4.y Monitoring stack in testing mode +---------------------------------------------------- + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y version while testing. + +Migrating +========= + +Move to version 4.y (the new version) +------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + + +Backup +^^^^^^ + +We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks installed with the older version running. + +If you run the new version in testing mode kill it by following the instructions on how to `Killing the new 4.y Monitoring stack in testing mode`_ +in the previous section. + +kill the older 3.x version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/copy/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 3.x +----------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 3.x after you completed moving to version 4.y (as shown above), run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-3.x/ + ./start-all.sh -d /path/to/original/data/dir + +Post-installation: Metrics back-filling +======================================= +Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus's recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards. + +For example, this is a recording rule that calculates the p99 write latency: + +.. code-block:: yaml + + - record: wlatencyp99 + expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le)) + labels: + by: "instance,shard" + +For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown. + +Scylla Monitoring versions 4.0 and newer will rely only on recording rules. + + .. note:: + If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown. + + +.. figure:: before-backfilling.png + :width: 400pt + + **This is an example of missing latency graph** + +The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8. + +For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago. + +In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period. + +The following instructions are based on the recording rules backfilling section in the `Prometheus documentation`_. + +.. _`Prometheus documentation` : https://prometheus.io/docs/prometheus/latest/storage/#backfilling-for-recording-rules + +Determine the backfilling period +-------------------------------- +When you run the backfilling process you need to determine the start time and end time. + +Determine the start time +^^^^^^^^^^^^^^^^^^^^^^^^ +The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: `http://{ip}:9090/status`. + +If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section. + +For the rest of this example, we will assume that your retention time is 360 days. + +Determine the end time +^^^^^^^^^^^^^^^^^^^^^^ +Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago. + +If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months. + +That nine months gap (12 months minus 3) is what we want to fill with back-filling. + +The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time. + +Backfilling Process +------------------- +backup +^^^^^^ +If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process. + +To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The ``-d`` +command-line option) You cannot complete it. + +Restart the monitoring stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +You need to stop the monitoring stack and run the ``stat-all.sh`` command with an additional flag: + +``-b "--storage.tsdb.allow-overlapping-blocks"`` + +Create the data files +^^^^^^^^^^^^^^^^^^^^^^^^^ +We will use the Promtool utility; it's already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago. + +The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : ``echo $((`date +%s` - 3600*24*90))`` + +Log in to your docker container and run the following (``start`` and ``end`` should be the start and end in epoc time): + +.. code-block:: bash + + docker exec -it aprom sh + cd /prometheus/data/ + promtool tsdb create-blocks-from rules \ + --start $start \ + --end $end \ + --url http://localhost:9090 \ + /etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml + +It will create a ``data`` directory in the directory where you run it. +The reason to run it under the ``/prometheus/data/`` is you can be sure Prometheus has write privileges there. + + .. note:: + Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, + for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations + (e.g. instead of an entire year, do it a weeks at a time). + + +Copy the data files +^^^^^^^^^^^^^^^^^^^ +Make sure that the process is completed successfully - don't start this section before you complete the previous sections. + +Copy the data files to the Prometheus directory: + +.. code-block:: bash + + cp data/* . + +The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using ``docker restart aprom`` + +Follow the logs ``docker logs aprom`` to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time. + +.. figure:: after-backfilling.jpg + :width: 400pt + + Un example: after loading half of the data + + +Related Links +============= + +* :doc:`Upgrade` diff --git a/stable/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt b/stable/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt new file mode 100644 index 000000000..95cec1d4e --- /dev/null +++ b/stable/_sources/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst.txt @@ -0,0 +1,150 @@ +====================================================================== +Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b +====================================================================== + +This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1. + +Upgrade Procedure +================= + +We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version. + +Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar. + +Install 4.y.b (The new version) +------------------------------- + +.. code-block:: bash + + wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip + unzip scylla-monitoring-4.y.b.zip + cd scylla-monitoring-scylla-monitoring-4.y.b/ + +Replace “y” with the new minor release number, for example, 4.0.1.zip + +Setting the server's files +-------------------------- + +Copy the target files ``scylla_servers.yml`` and ``scylla_manager_servers.yml`` from the version that is already installed. + +.. code-block:: bash + + cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/ + cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/ + +Validate the port numbers +^^^^^^^^^^^^^^^^^^^^^^^^^ +ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent. + +Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target. + +.. caution:: + + As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics. + +Validate the new version is running the correct version +------------------------------------------------------- + +Run: + +.. code-block:: bash + + ./start-all.sh --version + +To validate the Scylla-Monitoring version. + + +Validate the version installed correctly +---------------------------------------- + +To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack. + +.. code-block:: bash + + ./start-all.sh -p 9091 -g 3001 -m 9095 + +Browse to ``http://{ip}:9091`` +And check the Grafana dashboard + +Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager. + +.. caution:: + + Important: do not use the local dir flag when testing! + +When you are satisfied with the data in the dashboard, you can shut down the containers. + +.. caution:: + + Important: Do not kill the 4.x.a version that is currently running. + +Killing the new 4.y.b Monitoring stack in testing mode +------------------------------------------------------ + +Use the following command to kill the containers: + +.. code-block:: bash + + ./kill-all.sh -p 9091 -g 3001 -m 9095 + +You can start and stop the new 4.y.b version while testing. + +Move to version 4.y.b (the new version) +--------------------------------------- + +Note: migrating will cause a few seconds of blackout in the system. + +We assume that you are using external volume to store the metrics data. + +Kill all containers +^^^^^^^^^^^^^^^^^^^ + +At this point you have two monitoring stacks running side by side, you should kill both before +continuing. + +Kill the newer version that runs in testing mode by following the instructions on how to `Killing the new 4.y.b Monitoring stack in testing mode`_ +in the previous section + +kill the older 4.x.a version containers by running: + +.. code-block:: bash + + ./kill-all.sh + +Start version 4.y.b in normal mode + + +From the new root of the `scylla-monitoring-scylla-monitoring-4.y.b` run + +.. code-block:: bash + + ./start-all.sh -d /path/to/data/dir + + +Point your browser to ``http://{ip}:3000`` and see that the data is there. + +Rollback to version 4.x.a +------------------------- + + +To rollback during the testing mode, follow `Killing the new 4.y.b Monitoring stack in testing mode`_ as explained previously +and the system will continue to operate normally. + +To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run: + +.. code-block:: bash + + ./kill-all.sh + cd /path/to/scylla-grafana-4.x.a/ + ./start-all.sh -d /path/to/data/dir + +Related Links +============= + +* `ScyllaDB Monitoring `_ +* :doc:`Upgrade` diff --git a/stable/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt b/stable/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt new file mode 100644 index 000000000..14a76c760 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlAllowFiltering.rst.txt @@ -0,0 +1,5 @@ +Some queries use ALLOW FILTERING +-------------------------------- +Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a *full scan* on the table: read **all** of the table's data from disk, and then filter and return part of it to the user. More information on `ALLOW FILTERING `_. + +These kinds of queries can create a bigger load on Scylla, and should be used with care. diff --git a/stable/_sources/use-monitoring/advisor/cqlCLAll.rst.txt b/stable/_sources/use-monitoring/advisor/cqlCLAll.rst.txt new file mode 100644 index 000000000..f86568a31 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlCLAll.rst.txt @@ -0,0 +1,11 @@ +Some queries use Consistency Level: ALL +--------------------------------------- +Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query's Consistency Level determines how many replicas will need to be queried before a reply is returned. + +Using consistency level ALL in a query requires **all** replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case **one** of the replicas is down or not responding, reducing the HA of the system. + +Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/stable/_sources/use-monitoring/advisor/cqlCLAny.rst.txt b/stable/_sources/use-monitoring/advisor/cqlCLAny.rst.txt new file mode 100644 index 000000000..f2c5895e1 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlCLAny.rst.txt @@ -0,0 +1,10 @@ +Some queries use Consistency Level: ANY +--------------------------------------- + +Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned. + +Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care. + +Link to Scylla university +^^^^^^^^^^^^^^^^^^^^^^^^^ +`Lesson on Consistency `_ diff --git a/stable/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt b/stable/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt new file mode 100644 index 000000000..f451dc3a8 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlNoTokenAware.rst.txt @@ -0,0 +1,9 @@ +Some queries are not token-aware +-------------------------------- +Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage. + +Typically, your driver would know how to route the queries to a replication node, but if you're using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica. + +University link +^^^^^^^^^^^^^^^ +https://university.scylladb.com/courses/using-scylla-drivers/lessons/intro-and-recap-token-ring-architecture/ diff --git a/stable/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt b/stable/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt new file mode 100644 index 000000000..018b0c77c --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlNonPaged.rst.txt @@ -0,0 +1,7 @@ +Some SELECT queries are non-paged +--------------------------------- +By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries. + +Blog-post Links +^^^^^^^^^^^^^^^ +https://www.scylladb.com/2018/07/13/efficient-query-paging/ diff --git a/stable/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt b/stable/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt new file mode 100644 index 000000000..1a2b420b0 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/cqlNonPrepared.rst.txt @@ -0,0 +1,6 @@ +Some queries are non-prepared +----------------------------- +`Prepared Statements`_ are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements. + +.. _`Prepared Statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements \ No newline at end of file diff --git a/stable/_sources/use-monitoring/advisor/heavyCompaction.rst.txt b/stable/_sources/use-monitoring/advisor/heavyCompaction.rst.txt new file mode 100644 index 000000000..36be70a79 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/heavyCompaction.rst.txt @@ -0,0 +1,20 @@ +Compaction takes lots of memory and CPU +--------------------------------------- +ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance. + +If this is the case, you can do one of the following: + +* Statically limit the compaction shares with the ``compaction_static_shares`` option by setting a value between 50 and 1000: + + * In the ``scylla.yml`` configuration file: ``compaction_static_shares: 100`` + * In the command line when starting ScyllaDB: ``--compaction-static-shares 100`` + + You may start by setting the value ``100``. If read latency is impacted, which indicates that compaction is overly slowed down, + you can increase the value to reach the balance between the system performance and read latency. + +* Enforce ``min_threshold`` by setting ``compaction_enforce_min_threshold: true`` in the ``scylla.yml`` configuration file. + As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with ``min_threshold`` + or more. See `STCS options `_ for details. + diff --git a/stable/_sources/use-monitoring/advisor/index.rst.txt b/stable/_sources/use-monitoring/advisor/index.rst.txt new file mode 100644 index 000000000..06fc98c5f --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/index.rst.txt @@ -0,0 +1,37 @@ +=============================== +Scylla Monitoring Stack Advisor +=============================== + +.. toctree:: + :glob: + :maxdepth: 1 + :hidden: + + * + +The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them. + +The Advisor section +^^^^^^^^^^^^^^^^^^^^ + +.. figure:: ./advisor_panel.png + + **The Advisor section** + +The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue. + +For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance. + +Each Advisor issue is explained in detail: + +* :doc:`Some queries use ALLOW FILTERING ` +* :doc:`Some queries use Consistency Level: ALL ` +* :doc:`Some queries use Consistency Level: ANY ` +* :doc:`Some queries are not token-aware ` +* :doc:`Some SELECT queries are non-paged ` +* :doc:`Some queries are non-prepared ` +* :doc:`Some operation failed due to unsatisfied consistency level ` +* :doc:`I/O Errors can indicate a node with a faulty disk ` +* :doc:`Some operations failed on the replica side ` +* :doc:`CQL queries are not balanced among shards ` +* :doc:`Prepared statements cache eviction ` diff --git a/stable/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt b/stable/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt new file mode 100644 index 000000000..b03e196dc --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/nodeCLErrors.rst.txt @@ -0,0 +1,9 @@ +Some operation failed due to unsatisfied consistency level +---------------------------------------------------------- +ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query `Consistency Level`_, determines the number of replicas that must reply before the coordinator returns an answer. + +.. _`Consistency Level`: https://docs.scylladb.com/glossary/#term-consistency-level-cl + +For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer. + +When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level. diff --git a/stable/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt b/stable/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt new file mode 100644 index 000000000..475248f5c --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/nodeIOErrors.rst.txt @@ -0,0 +1,3 @@ +I/O Errors can indicate a node with a faulty disk +------------------------------------------------- +I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node's hardware. diff --git a/stable/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt b/stable/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt new file mode 100644 index 000000000..8d1bcd642 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/nodeLocalErrors.rst.txt @@ -0,0 +1,5 @@ +Some operations failed on the replica side +------------------------------------------ +ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer. + +An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors. diff --git a/stable/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt b/stable/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt new file mode 100644 index 000000000..06bb42a76 --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/nonBalancedcqlTraffic.rst.txt @@ -0,0 +1,9 @@ +CQL queries are not balanced among shards +----------------------------------------- +For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla. + +There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver. + +Blog post link +^^^^^^^^^^^^^^ +https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/ diff --git a/stable/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt b/stable/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt new file mode 100644 index 000000000..d240cb0db --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/preparedCacheEviction.rst.txt @@ -0,0 +1,10 @@ +Prepared statements cache eviction +--------------------------------------- + +Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it's an indication that something is wrong. +The two main sources are: + +* A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it. +* The prepared statements cache might be too small for the number of prepared statements. + diff --git a/stable/_sources/use-monitoring/advisor/systemOverload.rst.txt b/stable/_sources/use-monitoring/advisor/systemOverload.rst.txt new file mode 100644 index 000000000..ac0b7d62f --- /dev/null +++ b/stable/_sources/use-monitoring/advisor/systemOverload.rst.txt @@ -0,0 +1,12 @@ +System Overload +--------------- + +There could be multiple indications that a system is overloaded: + +* Timeouts +* Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough. +* CPU at 100% when no background process (like compaction or repair) runs. +* Queues are getting filled. + +If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system. + diff --git a/stable/_sources/use-monitoring/cql-optimization.rst.txt b/stable/_sources/use-monitoring/cql-optimization.rst.txt new file mode 100644 index 000000000..7ac8b2284 --- /dev/null +++ b/stable/_sources/use-monitoring/cql-optimization.rst.txt @@ -0,0 +1,155 @@ +==================== +The CQL Optimization +==================== + +The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver. + +.. figure:: cql_optimization_master.png + + **The CQL Dashboard** + +The upper part of the dashboard holds CQL related metrics. + +The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible. + +.. note:: Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic. + +The following sections describe each of the dashboard's panel + +Prepared Statements +^^^^^^^^^^^^^^^^^^^ + +`Prepared statements`_ are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values. + +.. _`Prepared statements`: https://docs.scylladb.com/getting-started/definitions/#prepared-statements + + +Using prepared statements has the following benefits: + +* The database only needs to parse the query once +* The driver can route the query to the right node +* Using place-holders and values is safer and prevents CQL-Injection + +The **CQL Non-Prepared Queries** Gauge shows the percentage of queries that are not prepared. + +The **CQL Non-Prepared Queries** Graph shows the rate of the queries. Make sure both are low. + +Token Aware +^^^^^^^^^^^ + +Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage. + +Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica. + +The **Non-Token Aware** Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node). + +The **Non-Token Aware Queries** Graph shows the rate of the queries that did not reach a replica-node, make sure both are low. + +Paged Queries +^^^^^^^^^^^^^ + +By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided. + +The **Non-Paged CQL Reads** Gauge shows the percentage of non-paged read queries that did not use paging. + +The **Non-Paged CQL Reads** Graph shows the rate of the non-paged queries, make sure both are low. + + +Reversed CQL Reads +^^^^^^^^^^^^^^^^^^ + +ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column. + +We strongly recommend using use the correct ordering. +Querying with an order different than the order the ``CLUSTERING ORDER BY`` was defined is supported, but not advisable. + + +For example, look at the following table: + +.. code-block:: shell + + CREATE TABLE ks1.table_demo ( + category text, + type int, + PRIMARY KEY (category, type)) + WITH CLUSTERING ORDER BY (type DESC); + + +The following query uses reverse order: + +.. code-block:: shell + + select * from ks1.table_demo where category='cat1' order by type ASC; + +The **Reversed CQL Reads** Gauge shows the percentage of read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``. + +The **Reversed CQL Reads** Graph shows the rate of the read queries that use ``ORDER BY`` that is different than the ``CLUSTERING ORDER BY``, make sure both are low. + +ALLOW FILTERING +^^^^^^^^^^^^^^^ + +Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system. + +These kinds of queries can create a big load on the system, and should be used with care. + +The CQL optimization dashboard, checks for two things related to queries that use ``ALLOW FILTERING``: how many such queries exist; and how much of the data that was read was +dropped before returning to the client. + +The **ALLOW FILTERING CQL Reads** Gauge shows the percentage of read queries that use ``ALLOW FILTERING``. + +The **ALLOW FILTERING CQL Reads** Graph shows the rate of the read queries that use ``ALLOW FILTERING``, make sure both are low. + +The **ALLOW FILTERING Filtered Rows** Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system. + +The **ALLOW FILTERING Filtered Rows** Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system. + +Consistency Level +^^^^^^^^^^^^^^^^^ + +Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas. + +The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client. + +Two consistency levels hold a potential problem and should be used with care ``ANY`` and ``ALL``. + +The **CQL ANY Queries** Gauge shows the percentage of queries that use Consistency Level ``ANY``. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost. + +The **CQL ANY CL Queries** Graph shows the rate of the queries that use Consistency Level ``ANY``, make sure both are low. + +The **CQL ALL CL Queries** Gauge shows the percentage of queries that use Consistency Level ``ALL``. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail. + +The **CQL ALL CL Queries** Graph shows the rate of the queries that use Consistency Level ``ALL``, make sure both are low. + +Cross DC +^^^^^^^^ + +Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided. + +Cross DC Consistency Level +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead. + +Cross DC read requests +^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. + If this is not the case, you will see the wrong result. + +In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system. + +The **Cross DC read requests** Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero. + diff --git a/stable/_sources/use-monitoring/index.rst.txt b/stable/_sources/use-monitoring/index.rst.txt new file mode 100644 index 000000000..4eb5847d3 --- /dev/null +++ b/stable/_sources/use-monitoring/index.rst.txt @@ -0,0 +1,15 @@ +============================= +Using Scylla Monitoring Stack +============================= + +.. toctree:: + :maxdepth: 3 + :hidden: + + CQL Optimization Dashboard + Advisor + +There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin: + +* :doc:`CQL Optimization Dashboard ` +* :doc:`Advisor ` \ No newline at end of file diff --git a/stable/_static/basic.css b/stable/_static/basic.css new file mode 100644 index 000000000..30fee9d0f --- /dev/null +++ b/stable/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/stable/_static/check-solid.svg b/stable/_static/check-solid.svg new file mode 100644 index 000000000..92fad4b5c --- /dev/null +++ b/stable/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/stable/_static/clipboard.min.js b/stable/_static/clipboard.min.js new file mode 100644 index 000000000..54b3c4638 --- /dev/null +++ b/stable/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/stable/_static/copybutton.css b/stable/_static/copybutton.css new file mode 100644 index 000000000..f1916ec7d --- /dev/null +++ b/stable/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

                                  Short

                                  + */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/stable/_static/copybutton.js b/stable/_static/copybutton.js new file mode 100644 index 000000000..2ea7ff3e2 --- /dev/null +++ b/stable/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/stable/_static/copybutton_funcs.js b/stable/_static/copybutton_funcs.js new file mode 100644 index 000000000..dbe1aaad7 --- /dev/null +++ b/stable/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/stable/_static/css/main.css b/stable/_static/css/main.css new file mode 100644 index 000000000..65eb0a553 --- /dev/null +++ b/stable/_static/css/main.css @@ -0,0 +1 @@ +@media print,screen and (min-width:40em){.reveal,.reveal.large,.reveal.small,.reveal.tiny{left:auto;margin:0 auto;right:auto}}/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}[data-whatinput=mouse] *,[data-whatinput=mouse] :focus,[data-whatinput=touch] *,[data-whatinput=touch] :focus,[data-whatintent=mouse] *,[data-whatintent=mouse] :focus,[data-whatintent=touch] *,[data-whatintent=touch] :focus{outline:0}[draggable=false]{-webkit-touch-callout:none;-webkit-user-select:none}.foundation-mq{font-family:"small=0em&medium=40em&large=64em&xlarge=75em&xxlarge=90em"}html{-webkit-box-sizing:border-box;font-size:100%}*,:after,:before{-webkit-box-sizing:inherit}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fefefe;color:#0a0a0a;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:1.5;margin:0;padding:0}img{-ms-interpolation-mode:bicubic;display:inline-block;height:auto;vertical-align:middle}textarea{border-radius:0;height:auto;min-height:50px}select{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.map_canvas embed,.map_canvas img,.map_canvas object,.mqa-display embed,.mqa-display img,.mqa-display object{max-width:none!important}button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:0;border-radius:0;cursor:auto;line-height:1;padding:0}[data-whatinput=mouse] button{outline:0}pre{-webkit-overflow-scrolling:touch;overflow:auto}button,input,optgroup,select,textarea{font-family:inherit}.is-visible{display:block!important}.is-hidden{display:none!important}[type=color],[type=date],[type=datetime-local],[type=datetime],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;-webkit-box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);box-shadow:inset 0 1px 2px hsla(0,0%,4%,.1);-webkit-box-sizing:border-box;box-sizing:border-box;color:#0a0a0a;display:block;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s;width:100%}[type=color]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=datetime]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,textarea:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}textarea{max-width:100%}textarea[rows]{height:auto}input:disabled,input[readonly],textarea:disabled,textarea[readonly]{background-color:#e6e6e6;cursor:not-allowed}[type=button],[type=submit]{-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0}input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}::-webkit-input-placeholder{color:#cacaca}::-moz-placeholder{color:#cacaca}:-ms-input-placeholder{color:#cacaca}::-ms-input-placeholder{color:#cacaca}::placeholder{color:#cacaca}[type=checkbox],[type=file],[type=radio]{margin:0 0 1rem}[type=checkbox]+label,[type=radio]+label{display:inline-block;margin-bottom:0;margin-left:.5rem;margin-right:1rem;vertical-align:baseline}[type=checkbox]+label[for],[type=radio]+label[for]{cursor:pointer}label>[type=checkbox],label>[type=radio]{margin-right:.5rem}[type=file]{width:100%}label{color:#0a0a0a;display:block;font-size:.875rem;font-weight:400;line-height:1.8;margin:0}label.middle{line-height:1.5;margin:0 0 1rem;padding:.5625rem 0}.help-text{color:#0a0a0a;font-size:.8125rem;font-style:italic;margin-top:-.5rem}.input-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;width:100%}.input-group>:first-child,.input-group>:first-child.input-group-button>*,.input-group>:last-child,.input-group>:last-child.input-group-button>*{border-radius:0}.input-group-button,.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label,.input-group-field,.input-group-label{margin:0;white-space:nowrap}.input-group-label{-webkit-box-flex:0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0 1rem;text-align:center;white-space:nowrap}.input-group-label:first-child{border-right:0}.input-group-label:last-child{border-left:0}.input-group-field{-webkit-box-flex:1;border-radius:0;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px;min-width:0}.input-group-button{-webkit-box-flex:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding-bottom:0;padding-top:0;text-align:center}.input-group-button a,.input-group-button button,.input-group-button input,.input-group-button label{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;font-size:1rem;height:auto;padding-bottom:0;padding-top:0}fieldset{border:0;margin:0;padding:0}legend{margin-bottom:.5rem;max-width:100%}.fieldset{border:1px solid #cacaca;margin:1.125rem 0;padding:1.25rem}.fieldset legend{margin:0 0 0 -.1875rem;padding:0 .1875rem}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fefefe;background-image:url('data:image/svg+xml;utf8,');background-origin:content-box;background-position:right -1rem center;background-repeat:no-repeat;background-size:9px 6px;border:1px solid #cacaca;border-radius:0;color:#0a0a0a;font-family:inherit;font-size:1rem;font-weight:400;height:2.4375rem;line-height:1.5;margin:0 0 1rem;padding:.5rem 1.5rem .5rem .5rem;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}@media screen and (min-width:0\0){select{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIpJREFUeNrEkckNgDAMBBfRkEt0ObRBBdsGXUDgmQfK4XhH2m8czQAAy27R3tsw4Qfe2x8uOO6oYLb6GlOor3GF+swURAOmUJ+RwtEJs9WvTGEYxBXqI1MQAZhCfUQKRzDMVj+TwrAIV6jvSUEkYAr1LSkcyTBb/V+KYfX7xAeusq3sLDtGH3kEGACPWIflNZfhRQAAAABJRU5ErkJggg==)}}select:focus{background-color:#fefefe;border:1px solid #8a8a8a;-webkit-box-shadow:0 0 5px #cacaca;box-shadow:0 0 5px #cacaca;outline:0;-webkit-transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:border-color .25s ease-in-out,-webkit-box-shadow .5s;transition:box-shadow .5s,border-color .25s ease-in-out;transition:box-shadow .5s,border-color .25s ease-in-out,-webkit-box-shadow .5s}select:disabled{background-color:#e6e6e6;cursor:not-allowed}select::-ms-expand{display:none}select[multiple]{background-image:none;height:auto}select:not([multiple]){padding-bottom:0;padding-top:0}.is-invalid-input:not(:focus){background-color:#f9ecea;border-color:#cc4b37}.is-invalid-input:not(:focus)::-webkit-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-moz-placeholder{color:#cc4b37}.is-invalid-input:not(:focus):-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::-ms-input-placeholder{color:#cc4b37}.is-invalid-input:not(:focus)::placeholder{color:#cc4b37}.form-error,.is-invalid-label{color:#cc4b37}.form-error{display:none;font-size:.75rem;font-weight:700;margin-bottom:1rem;margin-top:-.5rem}.form-error.is-visible{display:block}blockquote,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,li,ol,p,pre,td,th,ul{margin:0;padding:0}p{font-size:inherit;line-height:1.6;margin-bottom:1rem;text-rendering:optimizeLegibility}em,i{font-style:italic}b,em,i,strong{line-height:inherit}b,strong{font-weight:700}small{font-size:80%;line-height:inherit}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;font-family:Helvetica Neue,Helvetica,Roboto,Arial,sans-serif;font-style:normal;font-weight:400;text-rendering:optimizeLegibility}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#cacaca;line-height:0}.h1,h1{font-size:1.5rem}.h1,.h2,h1,h2{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h2,h2{font-size:1.25rem}.h3,h3{font-size:1.1875rem}.h3,.h4,h3,h4{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h4,h4{font-size:1.125rem}.h5,h5{font-size:1.0625rem}.h5,.h6,h5,h6{line-height:1.4;margin-bottom:.5rem;margin-top:0}.h6,h6{font-size:1rem}@media print,screen and (min-width:40em){.h1,h1{font-size:3rem}.h2,h2{font-size:2.5rem}.h3,h3{font-size:1.9375rem}.h4,h4{font-size:1.5625rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}}a{color:#1779ba;cursor:pointer;line-height:inherit;text-decoration:none}a:focus,a:hover{color:#1468a0}a img,hr{border:0}hr{border-bottom:1px solid #cacaca;clear:both;height:0;margin:1.25rem auto;max-width:75rem}dl,ol,ul{line-height:1.6;list-style-position:outside;margin-bottom:1rem}li{font-size:inherit}ul{list-style-type:disc}ol,ul{margin-left:1.25rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0;margin-left:1.25rem}dl{margin-bottom:1rem}dl dt{font-weight:700;margin-bottom:.3rem}blockquote{border-left:1px solid #cacaca;margin:0 0 1rem;padding:.5625rem 1.25rem 0 1.1875rem}blockquote,blockquote p{color:#8a8a8a;line-height:1.6}abbr,abbr[title]{border-bottom:1px dotted #0a0a0a;cursor:help;text-decoration:none}figure,kbd{margin:0}kbd{background-color:#e6e6e6;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;padding:.125rem .25rem 0}.subheader{color:#8a8a8a;font-weight:400;line-height:1.4;margin-bottom:.5rem;margin-top:.2rem}.lead{font-size:125%;line-height:1.6}.stat{font-size:2.5rem;line-height:1}p+.stat{margin-top:-1rem}ol.no-bullet,ul.no-bullet{list-style:none;margin-left:0}.cite-block,cite{color:#8a8a8a;display:block;font-size:.8125rem}.cite-block:before,cite:before{content:"— "}.code-inline,code{word-wrap:break-word;display:inline;max-width:100%;padding:.125rem .3125rem .0625rem}.code-block,.code-inline,code{background-color:#e6e6e6;border:1px solid #cacaca;color:#0a0a0a;font-family:Consolas,Liberation Mono,Courier,monospace;font-weight:400}.code-block{display:block;margin-bottom:1.5rem;overflow:auto;padding:1rem;white-space:pre}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}@media print,screen and (min-width:40em){.medium-text-left{text-align:left}.medium-text-right{text-align:right}.medium-text-center{text-align:center}.medium-text-justify{text-align:justify}}@media print,screen and (min-width:64em){.large-text-left{text-align:left}.large-text-right{text-align:right}.large-text-center{text-align:center}.large-text-justify{text-align:justify}}.show-for-print{display:none!important}@media print{*{background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;color:#000!important;-webkit-print-color-adjust:economy;print-color-adjust:economy;text-shadow:none!important}.show-for-print{display:block!important}.hide-for-print{display:none!important}table.show-for-print{display:table!important}thead.show-for-print{display:table-header-group!important}tbody.show-for-print{display:table-row-group!important}tr.show-for-print{display:table-row!important}td.show-for-print,th.show-for-print{display:table-cell!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}abbr[title]:after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #8a8a8a;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.print-break-inside{page-break-inside:auto}}.grid-container{margin-left:auto;margin-right:auto;max-width:75rem;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.fluid{margin-left:auto;margin-right:auto;max-width:100%;padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-container.fluid{padding-left:.9375rem;padding-right:.9375rem}}.grid-container.full{margin-left:auto;margin-right:auto;max-width:100%;padding-left:0;padding-right:0}.grid-x{-webkit-box-orient:horizontal;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.cell{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-height:0;min-width:0;width:100%}.cell.auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0}.cell.shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.auto,.grid-x>.shrink{width:auto}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9,.grid-x>.small-full,.grid-x>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-full,.grid-x>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-full,.grid-x>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-x>.small-1,.grid-x>.small-10,.grid-x>.small-11,.grid-x>.small-12,.grid-x>.small-2,.grid-x>.small-3,.grid-x>.small-4,.grid-x>.small-5,.grid-x>.small-6,.grid-x>.small-7,.grid-x>.small-8,.grid-x>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.small-1{width:8.3333333333%}.grid-x>.small-2{width:16.6666666667%}.grid-x>.small-3{width:25%}.grid-x>.small-4{width:33.3333333333%}.grid-x>.small-5{width:41.6666666667%}.grid-x>.small-6{width:50%}.grid-x>.small-7{width:58.3333333333%}.grid-x>.small-8{width:66.6666666667%}.grid-x>.small-9{width:75%}.grid-x>.small-10{width:83.3333333333%}.grid-x>.small-11{width:91.6666666667%}.grid-x>.small-12{width:100%}@media print,screen and (min-width:40em){.grid-x>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.medium-1,.grid-x>.medium-10,.grid-x>.medium-11,.grid-x>.medium-12,.grid-x>.medium-2,.grid-x>.medium-3,.grid-x>.medium-4,.grid-x>.medium-5,.grid-x>.medium-6,.grid-x>.medium-7,.grid-x>.medium-8,.grid-x>.medium-9,.grid-x>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.medium-shrink{width:auto}.grid-x>.medium-1{width:8.3333333333%}.grid-x>.medium-2{width:16.6666666667%}.grid-x>.medium-3{width:25%}.grid-x>.medium-4{width:33.3333333333%}.grid-x>.medium-5{width:41.6666666667%}.grid-x>.medium-6{width:50%}.grid-x>.medium-7{width:58.3333333333%}.grid-x>.medium-8{width:66.6666666667%}.grid-x>.medium-9{width:75%}.grid-x>.medium-10{width:83.3333333333%}.grid-x>.medium-11{width:91.6666666667%}.grid-x>.medium-12{width:100%}}@media print,screen and (min-width:64em){.grid-x>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;width:auto}.grid-x>.large-1,.grid-x>.large-10,.grid-x>.large-11,.grid-x>.large-12,.grid-x>.large-2,.grid-x>.large-3,.grid-x>.large-4,.grid-x>.large-5,.grid-x>.large-6,.grid-x>.large-7,.grid-x>.large-8,.grid-x>.large-9,.grid-x>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-x>.large-shrink{width:auto}.grid-x>.large-1{width:8.3333333333%}.grid-x>.large-2{width:16.6666666667%}.grid-x>.large-3{width:25%}.grid-x>.large-4{width:33.3333333333%}.grid-x>.large-5{width:41.6666666667%}.grid-x>.large-6{width:50%}.grid-x>.large-7{width:58.3333333333%}.grid-x>.large-8{width:66.6666666667%}.grid-x>.large-9{width:75%}.grid-x>.large-10{width:83.3333333333%}.grid-x>.large-11{width:91.6666666667%}.grid-x>.large-12{width:100%}}.grid-margin-x:not(.grid-x)>.cell{width:auto}.grid-margin-y:not(.grid-y)>.cell{height:auto}.grid-margin-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-margin-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-margin-x>.cell{margin-left:.625rem;margin-right:.625rem;width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.cell{margin-left:.9375rem;margin-right:.9375rem;width:calc(100% - 1.875rem)}}.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.25rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.25rem)}.grid-margin-x>.small-3{width:calc(25% - 1.25rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.25rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.25rem)}.grid-margin-x>.small-6{width:calc(50% - 1.25rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.25rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.25rem)}.grid-margin-x>.small-9{width:calc(75% - 1.25rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.25rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.25rem)}.grid-margin-x>.small-12{width:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x>.auto,.grid-margin-x>.shrink{width:auto}.grid-margin-x>.small-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.small-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.small-3{width:calc(25% - 1.875rem)}.grid-margin-x>.small-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.small-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.small-6{width:calc(50% - 1.875rem)}.grid-margin-x>.small-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.small-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.small-9{width:calc(75% - 1.875rem)}.grid-margin-x>.small-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.small-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.small-12{width:calc(100% - 1.875rem)}.grid-margin-x>.medium-auto,.grid-margin-x>.medium-shrink{width:auto}.grid-margin-x>.medium-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.medium-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.medium-3{width:calc(25% - 1.875rem)}.grid-margin-x>.medium-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.medium-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.medium-6{width:calc(50% - 1.875rem)}.grid-margin-x>.medium-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.medium-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.medium-9{width:calc(75% - 1.875rem)}.grid-margin-x>.medium-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.medium-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.medium-12{width:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x>.large-auto,.grid-margin-x>.large-shrink{width:auto}.grid-margin-x>.large-1{width:calc(8.33333% - 1.875rem)}.grid-margin-x>.large-2{width:calc(16.66667% - 1.875rem)}.grid-margin-x>.large-3{width:calc(25% - 1.875rem)}.grid-margin-x>.large-4{width:calc(33.33333% - 1.875rem)}.grid-margin-x>.large-5{width:calc(41.66667% - 1.875rem)}.grid-margin-x>.large-6{width:calc(50% - 1.875rem)}.grid-margin-x>.large-7{width:calc(58.33333% - 1.875rem)}.grid-margin-x>.large-8{width:calc(66.66667% - 1.875rem)}.grid-margin-x>.large-9{width:calc(75% - 1.875rem)}.grid-margin-x>.large-10{width:calc(83.33333% - 1.875rem)}.grid-margin-x>.large-11{width:calc(91.66667% - 1.875rem)}.grid-margin-x>.large-12{width:calc(100% - 1.875rem)}}.grid-padding-x .grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-padding-x .grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-container:not(.full)>.grid-padding-x{margin-left:-.625rem;margin-right:-.625rem}@media print,screen and (min-width:40em){.grid-container:not(.full)>.grid-padding-x{margin-left:-.9375rem;margin-right:-.9375rem}}.grid-padding-x>.cell{padding-left:.625rem;padding-right:.625rem}@media print,screen and (min-width:40em){.grid-padding-x>.cell{padding-left:.9375rem;padding-right:.9375rem}}.small-up-1>.cell{width:100%}.small-up-2>.cell{width:50%}.small-up-3>.cell{width:33.3333333333%}.small-up-4>.cell{width:25%}.small-up-5>.cell{width:20%}.small-up-6>.cell{width:16.6666666667%}.small-up-7>.cell{width:14.2857142857%}.small-up-8>.cell{width:12.5%}@media print,screen and (min-width:40em){.medium-up-1>.cell{width:100%}.medium-up-2>.cell{width:50%}.medium-up-3>.cell{width:33.3333333333%}.medium-up-4>.cell{width:25%}.medium-up-5>.cell{width:20%}.medium-up-6>.cell{width:16.6666666667%}.medium-up-7>.cell{width:14.2857142857%}.medium-up-8>.cell{width:12.5%}}@media print,screen and (min-width:64em){.large-up-1>.cell{width:100%}.large-up-2>.cell{width:50%}.large-up-3>.cell{width:33.3333333333%}.large-up-4>.cell{width:25%}.large-up-5>.cell{width:20%}.large-up-6>.cell{width:16.6666666667%}.large-up-7>.cell{width:14.2857142857%}.large-up-8>.cell{width:12.5%}}.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.25rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.25rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.25rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.25rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.25rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.25rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.25rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-x.small-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.small-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.small-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.small-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.small-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.small-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.small-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.small-up-8>.cell{width:calc(12.5% - 1.875rem)}.grid-margin-x.medium-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.medium-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.medium-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.medium-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.medium-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.medium-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.medium-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.medium-up-8>.cell{width:calc(12.5% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-x.large-up-1>.cell{width:calc(100% - 1.875rem)}.grid-margin-x.large-up-2>.cell{width:calc(50% - 1.875rem)}.grid-margin-x.large-up-3>.cell{width:calc(33.33333% - 1.875rem)}.grid-margin-x.large-up-4>.cell{width:calc(25% - 1.875rem)}.grid-margin-x.large-up-5>.cell{width:calc(20% - 1.875rem)}.grid-margin-x.large-up-6>.cell{width:calc(16.66667% - 1.875rem)}.grid-margin-x.large-up-7>.cell{width:calc(14.28571% - 1.875rem)}.grid-margin-x.large-up-8>.cell{width:calc(12.5% - 1.875rem)}}.small-margin-collapse,.small-margin-collapse>.cell{margin-left:0;margin-right:0}.small-margin-collapse>.small-1{width:8.3333333333%}.small-margin-collapse>.small-2{width:16.6666666667%}.small-margin-collapse>.small-3{width:25%}.small-margin-collapse>.small-4{width:33.3333333333%}.small-margin-collapse>.small-5{width:41.6666666667%}.small-margin-collapse>.small-6{width:50%}.small-margin-collapse>.small-7{width:58.3333333333%}.small-margin-collapse>.small-8{width:66.6666666667%}.small-margin-collapse>.small-9{width:75%}.small-margin-collapse>.small-10{width:83.3333333333%}.small-margin-collapse>.small-11{width:91.6666666667%}.small-margin-collapse>.small-12{width:100%}@media print,screen and (min-width:40em){.small-margin-collapse>.medium-1{width:8.3333333333%}.small-margin-collapse>.medium-2{width:16.6666666667%}.small-margin-collapse>.medium-3{width:25%}.small-margin-collapse>.medium-4{width:33.3333333333%}.small-margin-collapse>.medium-5{width:41.6666666667%}.small-margin-collapse>.medium-6{width:50%}.small-margin-collapse>.medium-7{width:58.3333333333%}.small-margin-collapse>.medium-8{width:66.6666666667%}.small-margin-collapse>.medium-9{width:75%}.small-margin-collapse>.medium-10{width:83.3333333333%}.small-margin-collapse>.medium-11{width:91.6666666667%}.small-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.small-margin-collapse>.large-1{width:8.3333333333%}.small-margin-collapse>.large-2{width:16.6666666667%}.small-margin-collapse>.large-3{width:25%}.small-margin-collapse>.large-4{width:33.3333333333%}.small-margin-collapse>.large-5{width:41.6666666667%}.small-margin-collapse>.large-6{width:50%}.small-margin-collapse>.large-7{width:58.3333333333%}.small-margin-collapse>.large-8{width:66.6666666667%}.small-margin-collapse>.large-9{width:75%}.small-margin-collapse>.large-10{width:83.3333333333%}.small-margin-collapse>.large-11{width:91.6666666667%}.small-margin-collapse>.large-12{width:100%}}.small-padding-collapse{margin-left:0;margin-right:0}.small-padding-collapse>.cell{padding-left:0;padding-right:0}@media print,screen and (min-width:40em){.medium-margin-collapse,.medium-margin-collapse>.cell{margin-left:0;margin-right:0}.medium-margin-collapse>.small-1{width:8.3333333333%}.medium-margin-collapse>.small-2{width:16.6666666667%}.medium-margin-collapse>.small-3{width:25%}.medium-margin-collapse>.small-4{width:33.3333333333%}.medium-margin-collapse>.small-5{width:41.6666666667%}.medium-margin-collapse>.small-6{width:50%}.medium-margin-collapse>.small-7{width:58.3333333333%}.medium-margin-collapse>.small-8{width:66.6666666667%}.medium-margin-collapse>.small-9{width:75%}.medium-margin-collapse>.small-10{width:83.3333333333%}.medium-margin-collapse>.small-11{width:91.6666666667%}.medium-margin-collapse>.small-12{width:100%}.medium-margin-collapse>.medium-1{width:8.3333333333%}.medium-margin-collapse>.medium-2{width:16.6666666667%}.medium-margin-collapse>.medium-3{width:25%}.medium-margin-collapse>.medium-4{width:33.3333333333%}.medium-margin-collapse>.medium-5{width:41.6666666667%}.medium-margin-collapse>.medium-6{width:50%}.medium-margin-collapse>.medium-7{width:58.3333333333%}.medium-margin-collapse>.medium-8{width:66.6666666667%}.medium-margin-collapse>.medium-9{width:75%}.medium-margin-collapse>.medium-10{width:83.3333333333%}.medium-margin-collapse>.medium-11{width:91.6666666667%}.medium-margin-collapse>.medium-12{width:100%}}@media print,screen and (min-width:64em){.medium-margin-collapse>.large-1{width:8.3333333333%}.medium-margin-collapse>.large-2{width:16.6666666667%}.medium-margin-collapse>.large-3{width:25%}.medium-margin-collapse>.large-4{width:33.3333333333%}.medium-margin-collapse>.large-5{width:41.6666666667%}.medium-margin-collapse>.large-6{width:50%}.medium-margin-collapse>.large-7{width:58.3333333333%}.medium-margin-collapse>.large-8{width:66.6666666667%}.medium-margin-collapse>.large-9{width:75%}.medium-margin-collapse>.large-10{width:83.3333333333%}.medium-margin-collapse>.large-11{width:91.6666666667%}.medium-margin-collapse>.large-12{width:100%}}@media print,screen and (min-width:40em){.medium-padding-collapse{margin-left:0;margin-right:0}.medium-padding-collapse>.cell{padding-left:0;padding-right:0}}@media print,screen and (min-width:64em){.large-margin-collapse,.large-margin-collapse>.cell{margin-left:0;margin-right:0}.large-margin-collapse>.small-1{width:8.3333333333%}.large-margin-collapse>.small-2{width:16.6666666667%}.large-margin-collapse>.small-3{width:25%}.large-margin-collapse>.small-4{width:33.3333333333%}.large-margin-collapse>.small-5{width:41.6666666667%}.large-margin-collapse>.small-6{width:50%}.large-margin-collapse>.small-7{width:58.3333333333%}.large-margin-collapse>.small-8{width:66.6666666667%}.large-margin-collapse>.small-9{width:75%}.large-margin-collapse>.small-10{width:83.3333333333%}.large-margin-collapse>.small-11{width:91.6666666667%}.large-margin-collapse>.small-12{width:100%}.large-margin-collapse>.medium-1{width:8.3333333333%}.large-margin-collapse>.medium-2{width:16.6666666667%}.large-margin-collapse>.medium-3{width:25%}.large-margin-collapse>.medium-4{width:33.3333333333%}.large-margin-collapse>.medium-5{width:41.6666666667%}.large-margin-collapse>.medium-6{width:50%}.large-margin-collapse>.medium-7{width:58.3333333333%}.large-margin-collapse>.medium-8{width:66.6666666667%}.large-margin-collapse>.medium-9{width:75%}.large-margin-collapse>.medium-10{width:83.3333333333%}.large-margin-collapse>.medium-11{width:91.6666666667%}.large-margin-collapse>.medium-12{width:100%}.large-margin-collapse>.large-1{width:8.3333333333%}.large-margin-collapse>.large-2{width:16.6666666667%}.large-margin-collapse>.large-3{width:25%}.large-margin-collapse>.large-4{width:33.3333333333%}.large-margin-collapse>.large-5{width:41.6666666667%}.large-margin-collapse>.large-6{width:50%}.large-margin-collapse>.large-7{width:58.3333333333%}.large-margin-collapse>.large-8{width:66.6666666667%}.large-margin-collapse>.large-9{width:75%}.large-margin-collapse>.large-10{width:83.3333333333%}.large-margin-collapse>.large-11{width:91.6666666667%}.large-margin-collapse>.large-12{width:100%}.large-padding-collapse{margin-left:0;margin-right:0}.large-padding-collapse>.cell{padding-left:0;padding-right:0}}.small-offset-0{margin-left:0}.grid-margin-x>.small-offset-0{margin-left:.625rem}.small-offset-1{margin-left:8.3333333333%}.grid-margin-x>.small-offset-1{margin-left:calc(8.33333% + .625rem)}.small-offset-2{margin-left:16.6666666667%}.grid-margin-x>.small-offset-2{margin-left:calc(16.66667% + .625rem)}.small-offset-3{margin-left:25%}.grid-margin-x>.small-offset-3{margin-left:calc(25% + .625rem)}.small-offset-4{margin-left:33.3333333333%}.grid-margin-x>.small-offset-4{margin-left:calc(33.33333% + .625rem)}.small-offset-5{margin-left:41.6666666667%}.grid-margin-x>.small-offset-5{margin-left:calc(41.66667% + .625rem)}.small-offset-6{margin-left:50%}.grid-margin-x>.small-offset-6{margin-left:calc(50% + .625rem)}.small-offset-7{margin-left:58.3333333333%}.grid-margin-x>.small-offset-7{margin-left:calc(58.33333% + .625rem)}.small-offset-8{margin-left:66.6666666667%}.grid-margin-x>.small-offset-8{margin-left:calc(66.66667% + .625rem)}.small-offset-9{margin-left:75%}.grid-margin-x>.small-offset-9{margin-left:calc(75% + .625rem)}.small-offset-10{margin-left:83.3333333333%}.grid-margin-x>.small-offset-10{margin-left:calc(83.33333% + .625rem)}.small-offset-11{margin-left:91.6666666667%}.grid-margin-x>.small-offset-11{margin-left:calc(91.66667% + .625rem)}@media print,screen and (min-width:40em){.medium-offset-0{margin-left:0}.grid-margin-x>.medium-offset-0{margin-left:.9375rem}.medium-offset-1{margin-left:8.3333333333%}.grid-margin-x>.medium-offset-1{margin-left:calc(8.33333% + .9375rem)}.medium-offset-2{margin-left:16.6666666667%}.grid-margin-x>.medium-offset-2{margin-left:calc(16.66667% + .9375rem)}.medium-offset-3{margin-left:25%}.grid-margin-x>.medium-offset-3{margin-left:calc(25% + .9375rem)}.medium-offset-4{margin-left:33.3333333333%}.grid-margin-x>.medium-offset-4{margin-left:calc(33.33333% + .9375rem)}.medium-offset-5{margin-left:41.6666666667%}.grid-margin-x>.medium-offset-5{margin-left:calc(41.66667% + .9375rem)}.medium-offset-6{margin-left:50%}.grid-margin-x>.medium-offset-6{margin-left:calc(50% + .9375rem)}.medium-offset-7{margin-left:58.3333333333%}.grid-margin-x>.medium-offset-7{margin-left:calc(58.33333% + .9375rem)}.medium-offset-8{margin-left:66.6666666667%}.grid-margin-x>.medium-offset-8{margin-left:calc(66.66667% + .9375rem)}.medium-offset-9{margin-left:75%}.grid-margin-x>.medium-offset-9{margin-left:calc(75% + .9375rem)}.medium-offset-10{margin-left:83.3333333333%}.grid-margin-x>.medium-offset-10{margin-left:calc(83.33333% + .9375rem)}.medium-offset-11{margin-left:91.6666666667%}.grid-margin-x>.medium-offset-11{margin-left:calc(91.66667% + .9375rem)}}@media print,screen and (min-width:64em){.large-offset-0{margin-left:0}.grid-margin-x>.large-offset-0{margin-left:.9375rem}.large-offset-1{margin-left:8.3333333333%}.grid-margin-x>.large-offset-1{margin-left:calc(8.33333% + .9375rem)}.large-offset-2{margin-left:16.6666666667%}.grid-margin-x>.large-offset-2{margin-left:calc(16.66667% + .9375rem)}.large-offset-3{margin-left:25%}.grid-margin-x>.large-offset-3{margin-left:calc(25% + .9375rem)}.large-offset-4{margin-left:33.3333333333%}.grid-margin-x>.large-offset-4{margin-left:calc(33.33333% + .9375rem)}.large-offset-5{margin-left:41.6666666667%}.grid-margin-x>.large-offset-5{margin-left:calc(41.66667% + .9375rem)}.large-offset-6{margin-left:50%}.grid-margin-x>.large-offset-6{margin-left:calc(50% + .9375rem)}.large-offset-7{margin-left:58.3333333333%}.grid-margin-x>.large-offset-7{margin-left:calc(58.33333% + .9375rem)}.large-offset-8{margin-left:66.6666666667%}.grid-margin-x>.large-offset-8{margin-left:calc(66.66667% + .9375rem)}.large-offset-9{margin-left:75%}.grid-margin-x>.large-offset-9{margin-left:calc(75% + .9375rem)}.large-offset-10{margin-left:83.3333333333%}.grid-margin-x>.large-offset-10{margin-left:calc(83.33333% + .9375rem)}.large-offset-11{margin-left:91.6666666667%}.grid-margin-x>.large-offset-11{margin-left:calc(91.66667% + .9375rem)}}.grid-y{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.grid-y>.cell{height:auto;max-height:none}.grid-y>.auto,.grid-y>.shrink{height:auto}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9,.grid-y>.small-full,.grid-y>.small-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}@media print,screen and (min-width:40em){.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-full,.grid-y>.medium-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}@media print,screen and (min-width:64em){.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-full,.grid-y>.large-shrink{-ms-flex-preferred-size:auto;-webkit-flex-basis:auto;flex-basis:auto}}.grid-y>.small-1,.grid-y>.small-10,.grid-y>.small-11,.grid-y>.small-12,.grid-y>.small-2,.grid-y>.small-3,.grid-y>.small-4,.grid-y>.small-5,.grid-y>.small-6,.grid-y>.small-7,.grid-y>.small-8,.grid-y>.small-9{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.small-1{height:8.3333333333%}.grid-y>.small-2{height:16.6666666667%}.grid-y>.small-3{height:25%}.grid-y>.small-4{height:33.3333333333%}.grid-y>.small-5{height:41.6666666667%}.grid-y>.small-6{height:50%}.grid-y>.small-7{height:58.3333333333%}.grid-y>.small-8{height:66.6666666667%}.grid-y>.small-9{height:75%}.grid-y>.small-10{height:83.3333333333%}.grid-y>.small-11{height:91.6666666667%}.grid-y>.small-12{height:100%}@media print,screen and (min-width:40em){.grid-y>.medium-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.medium-1,.grid-y>.medium-10,.grid-y>.medium-11,.grid-y>.medium-12,.grid-y>.medium-2,.grid-y>.medium-3,.grid-y>.medium-4,.grid-y>.medium-5,.grid-y>.medium-6,.grid-y>.medium-7,.grid-y>.medium-8,.grid-y>.medium-9,.grid-y>.medium-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.medium-shrink{height:auto}.grid-y>.medium-1{height:8.3333333333%}.grid-y>.medium-2{height:16.6666666667%}.grid-y>.medium-3{height:25%}.grid-y>.medium-4{height:33.3333333333%}.grid-y>.medium-5{height:41.6666666667%}.grid-y>.medium-6{height:50%}.grid-y>.medium-7{height:58.3333333333%}.grid-y>.medium-8{height:66.6666666667%}.grid-y>.medium-9{height:75%}.grid-y>.medium-10{height:83.3333333333%}.grid-y>.medium-11{height:91.6666666667%}.grid-y>.medium-12{height:100%}}@media print,screen and (min-width:64em){.grid-y>.large-auto{-webkit-box-flex:1;-webkit-flex:1 1 0;-ms-flex:1 1 0px;flex:1 1 0;height:auto}.grid-y>.large-1,.grid-y>.large-10,.grid-y>.large-11,.grid-y>.large-12,.grid-y>.large-2,.grid-y>.large-3,.grid-y>.large-4,.grid-y>.large-5,.grid-y>.large-6,.grid-y>.large-7,.grid-y>.large-8,.grid-y>.large-9,.grid-y>.large-shrink{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.grid-y>.large-shrink{height:auto}.grid-y>.large-1{height:8.3333333333%}.grid-y>.large-2{height:16.6666666667%}.grid-y>.large-3{height:25%}.grid-y>.large-4{height:33.3333333333%}.grid-y>.large-5{height:41.6666666667%}.grid-y>.large-6{height:50%}.grid-y>.large-7{height:58.3333333333%}.grid-y>.large-8{height:66.6666666667%}.grid-y>.large-9{height:75%}.grid-y>.large-10{height:83.3333333333%}.grid-y>.large-11{height:91.6666666667%}.grid-y>.large-12{height:100%}}.grid-padding-y .grid-padding-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-padding-y .grid-padding-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-padding-y>.cell{padding-bottom:.625rem;padding-top:.625rem}@media print,screen and (min-width:40em){.grid-padding-y>.cell{padding-bottom:.9375rem;padding-top:.9375rem}}.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .grid-frame{width:100%}.cell-block{max-width:100%;overflow-x:auto}.cell-block,.cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.cell-block-y{max-height:100%;min-height:100%;overflow-y:auto}.cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}@media print,screen and (min-width:40em){.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .medium-grid-frame{width:100%}.medium-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.medium-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.medium-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.medium-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}@media print,screen and (min-width:64em){.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow:hidden;position:relative;width:100vw}.cell .large-grid-frame{width:100%}.large-cell-block{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-width:100%;overflow-x:auto}.large-cell-block-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:100%}.large-cell-block-container>.grid-x{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;max-height:100%}.large-cell-block-y{-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;max-height:100%;min-height:100%;overflow-y:auto}}.grid-y.grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}@media print,screen and (min-width:40em){.grid-y.medium-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}@media print,screen and (min-width:64em){.grid-y.large-grid-frame{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;height:100vh;overflow:hidden;position:relative;width:auto}}.cell .grid-y.grid-frame{height:100%}@media print,screen and (min-width:40em){.cell .grid-y.medium-grid-frame{height:100%}}@media print,screen and (min-width:64em){.cell .grid-y.large-grid-frame{height:100%}}.grid-margin-y{margin-bottom:-.625rem;margin-top:-.625rem}@media print,screen and (min-width:40em){.grid-margin-y{margin-bottom:-.9375rem;margin-top:-.9375rem}}.grid-margin-y>.cell{height:calc(100% - 1.25rem);margin-bottom:.625rem;margin-top:.625rem}@media print,screen and (min-width:40em){.grid-margin-y>.cell{height:calc(100% - 1.875rem);margin-bottom:.9375rem;margin-top:.9375rem}}.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.25rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.25rem)}.grid-margin-y>.small-3{height:calc(25% - 1.25rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.25rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.25rem)}.grid-margin-y>.small-6{height:calc(50% - 1.25rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.25rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.25rem)}.grid-margin-y>.small-9{height:calc(75% - 1.25rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.25rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.25rem)}.grid-margin-y>.small-12{height:calc(100% - 1.25rem)}@media print,screen and (min-width:40em){.grid-margin-y>.auto,.grid-margin-y>.shrink{height:auto}.grid-margin-y>.small-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.small-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.small-3{height:calc(25% - 1.875rem)}.grid-margin-y>.small-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.small-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.small-6{height:calc(50% - 1.875rem)}.grid-margin-y>.small-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.small-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.small-9{height:calc(75% - 1.875rem)}.grid-margin-y>.small-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.small-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.small-12{height:calc(100% - 1.875rem)}.grid-margin-y>.medium-auto,.grid-margin-y>.medium-shrink{height:auto}.grid-margin-y>.medium-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.medium-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.medium-3{height:calc(25% - 1.875rem)}.grid-margin-y>.medium-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.medium-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.medium-6{height:calc(50% - 1.875rem)}.grid-margin-y>.medium-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.medium-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.medium-9{height:calc(75% - 1.875rem)}.grid-margin-y>.medium-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.medium-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.medium-12{height:calc(100% - 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y>.large-auto,.grid-margin-y>.large-shrink{height:auto}.grid-margin-y>.large-1{height:calc(8.33333% - 1.875rem)}.grid-margin-y>.large-2{height:calc(16.66667% - 1.875rem)}.grid-margin-y>.large-3{height:calc(25% - 1.875rem)}.grid-margin-y>.large-4{height:calc(33.33333% - 1.875rem)}.grid-margin-y>.large-5{height:calc(41.66667% - 1.875rem)}.grid-margin-y>.large-6{height:calc(50% - 1.875rem)}.grid-margin-y>.large-7{height:calc(58.33333% - 1.875rem)}.grid-margin-y>.large-8{height:calc(66.66667% - 1.875rem)}.grid-margin-y>.large-9{height:calc(75% - 1.875rem)}.grid-margin-y>.large-10{height:calc(83.33333% - 1.875rem)}.grid-margin-y>.large-11{height:calc(91.66667% - 1.875rem)}.grid-margin-y>.large-12{height:calc(100% - 1.875rem)}}.grid-frame.grid-margin-y{height:calc(100vh + 1.25rem)}@media print,screen and (min-width:40em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-frame.grid-margin-y{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:40em){.grid-margin-y.medium-grid-frame{height:calc(100vh + 1.875rem)}}@media print,screen and (min-width:64em){.grid-margin-y.large-grid-frame{height:calc(100vh + 1.875rem)}}.button{-webkit-appearance:none;border:1px solid transparent;border-radius:0;cursor:pointer;display:inline-block;font-family:inherit;font-size:.9rem;line-height:1;margin:0 0 1rem;padding:.85em 1em;text-align:center;-webkit-transition:background-color .25s ease-out,color .25s ease-out;transition:background-color .25s ease-out,color .25s ease-out;vertical-align:middle}[data-whatinput=mouse] .button{outline:0}.button.tiny{font-size:.6rem}.button.small{font-size:.75rem}.button.large{font-size:1.25rem}.button.expanded{display:block;margin-left:0;margin-right:0;width:100%}.button,.button.disabled,.button.disabled:focus,.button.disabled:hover,.button[disabled],.button[disabled]:focus,.button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button:focus,.button:hover{background-color:#14679e;color:#fefefe}.button.primary,.button.primary.disabled,.button.primary.disabled:focus,.button.primary.disabled:hover,.button.primary[disabled],.button.primary[disabled]:focus,.button.primary[disabled]:hover{background-color:#1779ba;color:#fefefe}.button.primary:focus,.button.primary:hover{background-color:#126195;color:#fefefe}.button.secondary,.button.secondary.disabled,.button.secondary.disabled:focus,.button.secondary.disabled:hover,.button.secondary[disabled],.button.secondary[disabled]:focus,.button.secondary[disabled]:hover{background-color:#767676;color:#fefefe}.button.secondary:focus,.button.secondary:hover{background-color:#5e5e5e;color:#fefefe}.button.success,.button.success.disabled,.button.success.disabled:focus,.button.success.disabled:hover,.button.success[disabled],.button.success[disabled]:focus,.button.success[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button.success:focus,.button.success:hover{background-color:#22bb5b;color:#0a0a0a}.button.warning,.button.warning.disabled,.button.warning.disabled:focus,.button.warning.disabled:hover,.button.warning[disabled],.button.warning[disabled]:focus,.button.warning[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button.warning:focus,.button.warning:hover{background-color:#cc8b00;color:#0a0a0a}.button.alert,.button.alert.disabled,.button.alert.disabled:focus,.button.alert.disabled:hover,.button.alert[disabled],.button.alert[disabled]:focus,.button.alert[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button.alert:focus,.button.alert:hover{background-color:#a53b2a;color:#fefefe}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow:focus,.button.hollow:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{background-color:transparent}.button.hollow,.button.hollow.disabled,.button.hollow.disabled:focus,.button.hollow.disabled:hover,.button.hollow[disabled],.button.hollow[disabled]:focus,.button.hollow[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow:focus,.button.hollow:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.primary,.button.hollow.primary.disabled,.button.hollow.primary.disabled:focus,.button.hollow.primary.disabled:hover,.button.hollow.primary[disabled],.button.hollow.primary[disabled]:focus,.button.hollow.primary[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button.hollow.primary:focus,.button.hollow.primary:hover{border-color:#0c3d5d;color:#0c3d5d}.button.hollow.secondary,.button.hollow.secondary.disabled,.button.hollow.secondary.disabled:focus,.button.hollow.secondary.disabled:hover,.button.hollow.secondary[disabled],.button.hollow.secondary[disabled]:focus,.button.hollow.secondary[disabled]:hover{border:1px solid #767676;color:#767676}.button.hollow.secondary:focus,.button.hollow.secondary:hover{border-color:#3b3b3b;color:#3b3b3b}.button.hollow.success,.button.hollow.success.disabled,.button.hollow.success.disabled:focus,.button.hollow.success.disabled:hover,.button.hollow.success[disabled],.button.hollow.success[disabled]:focus,.button.hollow.success[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button.hollow.success:focus,.button.hollow.success:hover{border-color:#157539;color:#157539}.button.hollow.warning,.button.hollow.warning.disabled,.button.hollow.warning.disabled:focus,.button.hollow.warning.disabled:hover,.button.hollow.warning[disabled],.button.hollow.warning[disabled]:focus,.button.hollow.warning[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button.hollow.warning:focus,.button.hollow.warning:hover{border-color:#805700;color:#805700}.button.hollow.alert,.button.hollow.alert.disabled,.button.hollow.alert.disabled:focus,.button.hollow.alert.disabled:hover,.button.hollow.alert[disabled],.button.hollow.alert[disabled]:focus,.button.hollow.alert[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button.hollow.alert:focus,.button.hollow.alert:hover{border-color:#67251a;color:#67251a}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear:focus,.button.clear:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{background-color:transparent;border-color:transparent}.button.clear,.button.clear.disabled,.button.clear.disabled:focus,.button.clear.disabled:hover,.button.clear[disabled],.button.clear[disabled]:focus,.button.clear[disabled]:hover{color:#1779ba}.button.clear:focus,.button.clear:hover{color:#0c3d5d}.button.clear.primary,.button.clear.primary.disabled,.button.clear.primary.disabled:focus,.button.clear.primary.disabled:hover,.button.clear.primary[disabled],.button.clear.primary[disabled]:focus,.button.clear.primary[disabled]:hover{color:#1779ba}.button.clear.primary:focus,.button.clear.primary:hover{color:#0c3d5d}.button.clear.secondary,.button.clear.secondary.disabled,.button.clear.secondary.disabled:focus,.button.clear.secondary.disabled:hover,.button.clear.secondary[disabled],.button.clear.secondary[disabled]:focus,.button.clear.secondary[disabled]:hover{color:#767676}.button.clear.secondary:focus,.button.clear.secondary:hover{color:#3b3b3b}.button.clear.success,.button.clear.success.disabled,.button.clear.success.disabled:focus,.button.clear.success.disabled:hover,.button.clear.success[disabled],.button.clear.success[disabled]:focus,.button.clear.success[disabled]:hover{color:#3adb76}.button.clear.success:focus,.button.clear.success:hover{color:#157539}.button.clear.warning,.button.clear.warning.disabled,.button.clear.warning.disabled:focus,.button.clear.warning.disabled:hover,.button.clear.warning[disabled],.button.clear.warning[disabled]:focus,.button.clear.warning[disabled]:hover{color:#ffae00}.button.clear.warning:focus,.button.clear.warning:hover{color:#805700}.button.clear.alert,.button.clear.alert.disabled,.button.clear.alert.disabled:focus,.button.clear.alert.disabled:hover,.button.clear.alert[disabled],.button.clear.alert[disabled]:focus,.button.clear.alert[disabled]:hover{color:#cc4b37}.button.clear.alert:focus,.button.clear.alert:hover{color:#67251a}.button.disabled,.button[disabled]{cursor:not-allowed;opacity:.25}.button.dropdown:after{border-color:#fefefe transparent transparent;border-style:solid;border-width:.4em .4em 0;content:"";display:block;display:inline-block;float:right;height:0;margin-left:1em;position:relative;top:.4em;width:0}.button.dropdown.clear.primary:after,.button.dropdown.clear:after,.button.dropdown.hollow.primary:after,.button.dropdown.hollow:after{border-top-color:#1779ba}.button.dropdown.clear.secondary:after,.button.dropdown.hollow.secondary:after{border-top-color:#767676}.button.dropdown.clear.success:after,.button.dropdown.hollow.success:after{border-top-color:#3adb76}.button.dropdown.clear.warning:after,.button.dropdown.hollow.warning:after{border-top-color:#ffae00}.button.dropdown.clear.alert:after,.button.dropdown.hollow.alert:after{border-top-color:#cc4b37}.button.arrow-only:after{float:none;margin-left:0;top:-.1em}a.button:focus,a.button:hover{text-decoration:none}.button-group{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-box-flex:1;-ms-flex-positive:1;-webkit-align-items:stretch;align-items:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.button-group:after,.button-group:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.button-group:after{clear:both}.button-group:after,.button-group:before{display:none}.button-group .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;font-size:.9rem;margin:0 1px 1px 0}.button-group .button:last-child{margin-right:0}.button-group.tiny .button{font-size:.6rem}.button-group.small .button{font-size:.75rem}.button-group.large .button{font-size:1.25rem}.button-group.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.button-group.primary .button,.button-group.primary .button.disabled,.button-group.primary .button.disabled:focus,.button-group.primary .button.disabled:hover,.button-group.primary .button[disabled],.button-group.primary .button[disabled]:focus,.button-group.primary .button[disabled]:hover{background-color:#1779ba;color:#fefefe}.button-group.primary .button:focus,.button-group.primary .button:hover{background-color:#126195;color:#fefefe}.button-group.secondary .button,.button-group.secondary .button.disabled,.button-group.secondary .button.disabled:focus,.button-group.secondary .button.disabled:hover,.button-group.secondary .button[disabled],.button-group.secondary .button[disabled]:focus,.button-group.secondary .button[disabled]:hover{background-color:#767676;color:#fefefe}.button-group.secondary .button:focus,.button-group.secondary .button:hover{background-color:#5e5e5e;color:#fefefe}.button-group.success .button,.button-group.success .button.disabled,.button-group.success .button.disabled:focus,.button-group.success .button.disabled:hover,.button-group.success .button[disabled],.button-group.success .button[disabled]:focus,.button-group.success .button[disabled]:hover{background-color:#3adb76;color:#0a0a0a}.button-group.success .button:focus,.button-group.success .button:hover{background-color:#22bb5b;color:#0a0a0a}.button-group.warning .button,.button-group.warning .button.disabled,.button-group.warning .button.disabled:focus,.button-group.warning .button.disabled:hover,.button-group.warning .button[disabled],.button-group.warning .button[disabled]:focus,.button-group.warning .button[disabled]:hover{background-color:#ffae00;color:#0a0a0a}.button-group.warning .button:focus,.button-group.warning .button:hover{background-color:#cc8b00;color:#0a0a0a}.button-group.alert .button,.button-group.alert .button.disabled,.button-group.alert .button.disabled:focus,.button-group.alert .button.disabled:hover,.button-group.alert .button[disabled],.button-group.alert .button[disabled]:focus,.button-group.alert .button[disabled]:hover{background-color:#cc4b37;color:#fefefe}.button-group.alert .button:focus,.button-group.alert .button:hover{background-color:#a53b2a;color:#fefefe}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button:focus,.button-group.hollow .button:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{background-color:transparent}.button-group.hollow .button,.button-group.hollow .button.disabled,.button-group.hollow .button.disabled:focus,.button-group.hollow .button.disabled:hover,.button-group.hollow .button[disabled],.button-group.hollow .button[disabled]:focus,.button-group.hollow .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button:focus,.button-group.hollow .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.primary,.button-group.hollow .button.primary.disabled,.button-group.hollow .button.primary.disabled:focus,.button-group.hollow .button.primary.disabled:hover,.button-group.hollow .button.primary[disabled],.button-group.hollow .button.primary[disabled]:focus,.button-group.hollow .button.primary[disabled]:hover,.button-group.hollow.primary .button,.button-group.hollow.primary .button.disabled,.button-group.hollow.primary .button.disabled:focus,.button-group.hollow.primary .button.disabled:hover,.button-group.hollow.primary .button[disabled],.button-group.hollow.primary .button[disabled]:focus,.button-group.hollow.primary .button[disabled]:hover{border:1px solid #1779ba;color:#1779ba}.button-group.hollow .button.primary:focus,.button-group.hollow .button.primary:hover,.button-group.hollow.primary .button:focus,.button-group.hollow.primary .button:hover{border-color:#0c3d5d;color:#0c3d5d}.button-group.hollow .button.secondary,.button-group.hollow .button.secondary.disabled,.button-group.hollow .button.secondary.disabled:focus,.button-group.hollow .button.secondary.disabled:hover,.button-group.hollow .button.secondary[disabled],.button-group.hollow .button.secondary[disabled]:focus,.button-group.hollow .button.secondary[disabled]:hover,.button-group.hollow.secondary .button,.button-group.hollow.secondary .button.disabled,.button-group.hollow.secondary .button.disabled:focus,.button-group.hollow.secondary .button.disabled:hover,.button-group.hollow.secondary .button[disabled],.button-group.hollow.secondary .button[disabled]:focus,.button-group.hollow.secondary .button[disabled]:hover{border:1px solid #767676;color:#767676}.button-group.hollow .button.secondary:focus,.button-group.hollow .button.secondary:hover,.button-group.hollow.secondary .button:focus,.button-group.hollow.secondary .button:hover{border-color:#3b3b3b;color:#3b3b3b}.button-group.hollow .button.success,.button-group.hollow .button.success.disabled,.button-group.hollow .button.success.disabled:focus,.button-group.hollow .button.success.disabled:hover,.button-group.hollow .button.success[disabled],.button-group.hollow .button.success[disabled]:focus,.button-group.hollow .button.success[disabled]:hover,.button-group.hollow.success .button,.button-group.hollow.success .button.disabled,.button-group.hollow.success .button.disabled:focus,.button-group.hollow.success .button.disabled:hover,.button-group.hollow.success .button[disabled],.button-group.hollow.success .button[disabled]:focus,.button-group.hollow.success .button[disabled]:hover{border:1px solid #3adb76;color:#3adb76}.button-group.hollow .button.success:focus,.button-group.hollow .button.success:hover,.button-group.hollow.success .button:focus,.button-group.hollow.success .button:hover{border-color:#157539;color:#157539}.button-group.hollow .button.warning,.button-group.hollow .button.warning.disabled,.button-group.hollow .button.warning.disabled:focus,.button-group.hollow .button.warning.disabled:hover,.button-group.hollow .button.warning[disabled],.button-group.hollow .button.warning[disabled]:focus,.button-group.hollow .button.warning[disabled]:hover,.button-group.hollow.warning .button,.button-group.hollow.warning .button.disabled,.button-group.hollow.warning .button.disabled:focus,.button-group.hollow.warning .button.disabled:hover,.button-group.hollow.warning .button[disabled],.button-group.hollow.warning .button[disabled]:focus,.button-group.hollow.warning .button[disabled]:hover{border:1px solid #ffae00;color:#ffae00}.button-group.hollow .button.warning:focus,.button-group.hollow .button.warning:hover,.button-group.hollow.warning .button:focus,.button-group.hollow.warning .button:hover{border-color:#805700;color:#805700}.button-group.hollow .button.alert,.button-group.hollow .button.alert.disabled,.button-group.hollow .button.alert.disabled:focus,.button-group.hollow .button.alert.disabled:hover,.button-group.hollow .button.alert[disabled],.button-group.hollow .button.alert[disabled]:focus,.button-group.hollow .button.alert[disabled]:hover,.button-group.hollow.alert .button,.button-group.hollow.alert .button.disabled,.button-group.hollow.alert .button.disabled:focus,.button-group.hollow.alert .button.disabled:hover,.button-group.hollow.alert .button[disabled],.button-group.hollow.alert .button[disabled]:focus,.button-group.hollow.alert .button[disabled]:hover{border:1px solid #cc4b37;color:#cc4b37}.button-group.hollow .button.alert:focus,.button-group.hollow .button.alert:hover,.button-group.hollow.alert .button:focus,.button-group.hollow.alert .button:hover{border-color:#67251a;color:#67251a}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button:focus,.button-group.clear .button:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{background-color:transparent;border-color:transparent}.button-group.clear .button,.button-group.clear .button.disabled,.button-group.clear .button.disabled:focus,.button-group.clear .button.disabled:hover,.button-group.clear .button[disabled],.button-group.clear .button[disabled]:focus,.button-group.clear .button[disabled]:hover{color:#1779ba}.button-group.clear .button:focus,.button-group.clear .button:hover{color:#0c3d5d}.button-group.clear .button.primary,.button-group.clear .button.primary.disabled,.button-group.clear .button.primary.disabled:focus,.button-group.clear .button.primary.disabled:hover,.button-group.clear .button.primary[disabled],.button-group.clear .button.primary[disabled]:focus,.button-group.clear .button.primary[disabled]:hover,.button-group.clear.primary .button,.button-group.clear.primary .button.disabled,.button-group.clear.primary .button.disabled:focus,.button-group.clear.primary .button.disabled:hover,.button-group.clear.primary .button[disabled],.button-group.clear.primary .button[disabled]:focus,.button-group.clear.primary .button[disabled]:hover{color:#1779ba}.button-group.clear .button.primary:focus,.button-group.clear .button.primary:hover,.button-group.clear.primary .button:focus,.button-group.clear.primary .button:hover{color:#0c3d5d}.button-group.clear .button.secondary,.button-group.clear .button.secondary.disabled,.button-group.clear .button.secondary.disabled:focus,.button-group.clear .button.secondary.disabled:hover,.button-group.clear .button.secondary[disabled],.button-group.clear .button.secondary[disabled]:focus,.button-group.clear .button.secondary[disabled]:hover,.button-group.clear.secondary .button,.button-group.clear.secondary .button.disabled,.button-group.clear.secondary .button.disabled:focus,.button-group.clear.secondary .button.disabled:hover,.button-group.clear.secondary .button[disabled],.button-group.clear.secondary .button[disabled]:focus,.button-group.clear.secondary .button[disabled]:hover{color:#767676}.button-group.clear .button.secondary:focus,.button-group.clear .button.secondary:hover,.button-group.clear.secondary .button:focus,.button-group.clear.secondary .button:hover{color:#3b3b3b}.button-group.clear .button.success,.button-group.clear .button.success.disabled,.button-group.clear .button.success.disabled:focus,.button-group.clear .button.success.disabled:hover,.button-group.clear .button.success[disabled],.button-group.clear .button.success[disabled]:focus,.button-group.clear .button.success[disabled]:hover,.button-group.clear.success .button,.button-group.clear.success .button.disabled,.button-group.clear.success .button.disabled:focus,.button-group.clear.success .button.disabled:hover,.button-group.clear.success .button[disabled],.button-group.clear.success .button[disabled]:focus,.button-group.clear.success .button[disabled]:hover{color:#3adb76}.button-group.clear .button.success:focus,.button-group.clear .button.success:hover,.button-group.clear.success .button:focus,.button-group.clear.success .button:hover{color:#157539}.button-group.clear .button.warning,.button-group.clear .button.warning.disabled,.button-group.clear .button.warning.disabled:focus,.button-group.clear .button.warning.disabled:hover,.button-group.clear .button.warning[disabled],.button-group.clear .button.warning[disabled]:focus,.button-group.clear .button.warning[disabled]:hover,.button-group.clear.warning .button,.button-group.clear.warning .button.disabled,.button-group.clear.warning .button.disabled:focus,.button-group.clear.warning .button.disabled:hover,.button-group.clear.warning .button[disabled],.button-group.clear.warning .button[disabled]:focus,.button-group.clear.warning .button[disabled]:hover{color:#ffae00}.button-group.clear .button.warning:focus,.button-group.clear .button.warning:hover,.button-group.clear.warning .button:focus,.button-group.clear.warning .button:hover{color:#805700}.button-group.clear .button.alert,.button-group.clear .button.alert.disabled,.button-group.clear .button.alert.disabled:focus,.button-group.clear .button.alert.disabled:hover,.button-group.clear .button.alert[disabled],.button-group.clear .button.alert[disabled]:focus,.button-group.clear .button.alert[disabled]:hover,.button-group.clear.alert .button,.button-group.clear.alert .button.disabled,.button-group.clear.alert .button.disabled:focus,.button-group.clear.alert .button.disabled:hover,.button-group.clear.alert .button[disabled],.button-group.clear.alert .button[disabled]:focus,.button-group.clear.alert .button[disabled]:hover{color:#cc4b37}.button-group.clear .button.alert:focus,.button-group.clear .button.alert:hover,.button-group.clear.alert .button:focus,.button-group.clear.alert .button:hover{color:#67251a}.button-group.no-gaps .button{margin-right:-.0625rem}.button-group.no-gaps .button+.button{border-left-color:transparent}.button-group.stacked,.button-group.stacked-for-medium,.button-group.stacked-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.button-group.stacked .button,.button-group.stacked-for-medium .button,.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%}.button-group.stacked .button:last-child,.button-group.stacked-for-medium .button:last-child,.button-group.stacked-for-small .button:last-child{margin-bottom:0}.button-group.stacked-for-medium.expanded .button,.button-group.stacked-for-small.expanded .button,.button-group.stacked.expanded .button{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}@media print,screen and (min-width:40em){.button-group.stacked-for-small .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (min-width:64em){.button-group.stacked-for-medium .button{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-bottom:0}}@media print,screen and (max-width:39.99875em){.button-group.stacked-for-small.expanded{display:block}.button-group.stacked-for-small.expanded .button{display:block;margin-right:0}}@media print,screen and (max-width:63.99875em){.button-group.stacked-for-medium.expanded{display:block}.button-group.stacked-for-medium.expanded .button{display:block;margin-right:0}}.close-button{color:#8a8a8a;cursor:pointer;position:absolute;z-index:10}[data-whatinput=mouse] .close-button{outline:0}.close-button:focus,.close-button:hover{color:#0a0a0a}.close-button.small{font-size:1.5em;line-height:1;right:.66rem;top:.33em}.close-button,.close-button.medium{font-size:2em;line-height:1;right:1rem;top:.5rem}.label{border-radius:0;cursor:default;display:inline-block;font-size:.8rem;line-height:1;padding:.33333rem .5rem;white-space:nowrap}.label,.label.primary{background:#1779ba;color:#fefefe}.label.secondary{background:#767676;color:#fefefe}.label.success{background:#3adb76;color:#0a0a0a}.label.warning{background:#ffae00;color:#0a0a0a}.label.alert{background:#cc4b37;color:#fefefe}.progress{background-color:#cacaca;border-radius:0;height:1rem;margin-bottom:1rem}.progress.primary .progress-meter{background-color:#1779ba}.progress.secondary .progress-meter{background-color:#767676}.progress.success .progress-meter{background-color:#3adb76}.progress.warning .progress-meter{background-color:#ffae00}.progress.alert .progress-meter{background-color:#cc4b37}.progress-meter{background-color:#1779ba;display:block;height:100%;position:relative;width:0}.progress-meter-text{color:#fefefe;font-size:.75rem;font-weight:700;left:50%;margin:0;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);white-space:nowrap}.slider{background-color:#e6e6e6;cursor:pointer;height:.5rem;margin-bottom:2.25rem;margin-top:1.25rem;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.slider-fill{background-color:#cacaca;display:inline-block;height:.5rem;left:0;max-width:100%;position:absolute;top:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.slider-fill.is-dragging{-webkit-transition:all 0s linear;transition:all 0s linear}.slider-handle{background-color:#1779ba;border-radius:0;cursor:-webkit-grab;cursor:grab;display:inline-block;height:1.4rem;left:0;position:absolute;top:50%;-ms-touch-action:manipulation;touch-action:manipulation;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;width:1.4rem;z-index:1}[data-whatinput=mouse] .slider-handle{outline:0}.slider-handle:hover{background-color:#14679e}.slider-handle.is-dragging{cursor:-webkit-grabbing;cursor:grabbing;-webkit-transition:all 0s linear;transition:all 0s linear}.slider.disabled,.slider[disabled]{cursor:not-allowed;opacity:.25}.slider.vertical{display:inline-block;height:12.5rem;margin:0 1.25rem;-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);width:.5rem}.slider.vertical .slider-fill{max-height:100%;top:0;width:.5rem}.slider.vertical .slider-handle{height:1.4rem;left:50%;position:absolute;top:0;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);width:1.4rem}.switch{color:#fefefe;font-size:.875rem;font-weight:700;height:2rem;margin-bottom:1rem;outline:0;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-input{margin-bottom:0;opacity:0;position:absolute}.switch-paddle{background:#cacaca;border-radius:0;color:inherit;cursor:pointer;display:block;font-weight:inherit;height:2rem;position:relative;-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:4rem}input+.switch-paddle{margin:0}.switch-paddle:after{background:#fefefe;border-radius:0;content:"";display:block;height:1.5rem;left:.25rem;position:absolute;top:.25rem;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition:all .25s ease-out;transition:all .25s ease-out;width:1.5rem}input:checked~.switch-paddle{background:#1779ba}input:checked~.switch-paddle:after{left:2.25rem}input:disabled~.switch-paddle{cursor:not-allowed;opacity:.5}[data-whatinput=mouse] input:focus~.switch-paddle{outline:0}.switch-active,.switch-inactive{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.switch-active{display:none;left:8%}input:checked+label>.switch-active{display:block}.switch-inactive{right:15%}input:checked+label>.switch-inactive{display:none}.switch.tiny{height:1.5rem}.switch.tiny .switch-paddle{font-size:.625rem;height:1.5rem;width:3rem}.switch.tiny .switch-paddle:after{height:1rem;left:.25rem;top:.25rem;width:1rem}.switch.tiny input:checked~.switch-paddle:after{left:1.75rem}.switch.small{height:1.75rem}.switch.small .switch-paddle{font-size:.75rem;height:1.75rem;width:3.5rem}.switch.small .switch-paddle:after{height:1.25rem;left:.25rem;top:.25rem;width:1.25rem}.switch.small input:checked~.switch-paddle:after{left:2rem}.switch.large{height:2.5rem}.switch.large .switch-paddle{font-size:1rem;height:2.5rem;width:5rem}.switch.large .switch-paddle:after{height:2rem;left:.25rem;top:.25rem;width:2rem}.switch.large input:checked~.switch-paddle:after{left:2.75rem}table{border-collapse:collapse;border-radius:0;margin-bottom:1rem;width:100%}tbody,tfoot,thead{background-color:#fefefe;border:1px solid #f1f1f1}caption{font-weight:700;padding:.5rem .625rem .625rem}thead{background:#f8f8f8}tfoot,thead{color:#0a0a0a}tfoot{background:#f1f1f1}tfoot tr,thead tr{background:0 0}tfoot td,tfoot th,thead td,thead th{font-weight:700;padding:.5rem .625rem .625rem;text-align:left}tbody td,tbody th{padding:.5rem .625rem .625rem}tbody tr:nth-child(2n){background-color:#f1f1f1;border-bottom:0}table.unstriped tbody{background-color:#fefefe}table.unstriped tbody tr{background-color:#fefefe;border-bottom:1px solid #f1f1f1}@media print,screen and (max-width:63.99875em){table.stack tfoot,table.stack thead{display:none}table.stack td,table.stack th,table.stack tr{display:block}table.stack td{border-top:0}}table.scroll{display:block;overflow-x:auto;width:100%}table.hover thead tr:hover{background-color:#f3f3f3}table.hover tfoot tr:hover{background-color:#ececec}table.hover tbody tr:hover{background-color:#f9f9f9}table.hover:not(.unstriped) tr:nth-of-type(2n):hover{background-color:#ececec}.table-scroll{overflow-x:auto}.badge{border-radius:50%;display:inline-block;font-size:.6rem;min-width:2.1em;padding:.3em;text-align:center}.badge,.badge.primary{background:#1779ba;color:#fefefe}.badge.secondary{background:#767676;color:#fefefe}.badge.success{background:#3adb76;color:#0a0a0a}.badge.warning{background:#ffae00;color:#0a0a0a}.badge.alert{background:#cc4b37;color:#fefefe}.breadcrumbs{list-style:none;margin:0 0 1rem}.breadcrumbs:after,.breadcrumbs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.breadcrumbs:after{clear:both}.breadcrumbs li{color:#0a0a0a;cursor:default;float:left;font-size:.6875rem;text-transform:uppercase}.breadcrumbs li:not(:last-child):after{color:#cacaca;content:"/";margin:0 .75rem;opacity:1;position:relative}.breadcrumbs a{color:#1779ba}.breadcrumbs a:hover{text-decoration:underline}.breadcrumbs .disabled{color:#cacaca;cursor:not-allowed}.callout{background-color:#fff;border:1px solid hsla(0,0%,4%,.25);border-radius:0;color:#0a0a0a;margin:0 0 1rem;padding:1rem;position:relative}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout.primary{background-color:#d7ecfa;color:#0a0a0a}.callout.secondary{background-color:#eaeaea;color:#0a0a0a}.callout.success{background-color:#e1faea;color:#0a0a0a}.callout.warning{background-color:#fff3d9;color:#0a0a0a}.callout.alert{background-color:#f7e4e1;color:#0a0a0a}.callout.small{padding:.5rem}.callout.large{padding:3rem}.card{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-box-flex:1;-ms-flex-positive:1;background:#fefefe;border:1px solid #e6e6e6;border-radius:0;-webkit-box-shadow:none;box-shadow:none;color:#0a0a0a;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;margin-bottom:1rem;overflow:hidden}.card>:last-child{margin-bottom:0}.card-divider{-webkit-box-flex:0;background:#e6e6e6;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;padding:1rem}.card-divider>:last-child{margin-bottom:0}.card-section{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;padding:1rem}.card-section>:last-child{margin-bottom:0}.card-image{min-height:1px}.dropdown-pane{background-color:#fefefe;border:1px solid #cacaca;border-radius:0;display:none;font-size:1rem;padding:1rem;position:absolute;visibility:hidden;width:300px;z-index:10}.dropdown-pane.is-opening{display:block}.dropdown-pane.is-open{display:block;visibility:visible}.dropdown-pane.tiny{width:100px}.dropdown-pane.small{width:200px}.dropdown-pane.large{width:400px}.pagination{margin-bottom:1rem;margin-left:0}.pagination:after,.pagination:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.pagination:after{clear:both}.pagination li{border-radius:0;display:none;font-size:.875rem;margin-right:.0625rem}.pagination li:first-child,.pagination li:last-child{display:inline-block}@media print,screen and (min-width:40em){.pagination li{display:inline-block}}.pagination a,.pagination button{border-radius:0;color:#0a0a0a;display:block;padding:.1875rem .625rem}.pagination a:hover,.pagination button:hover{background:#e6e6e6}.pagination .current{background:#1779ba;color:#fefefe;cursor:default;padding:.1875rem .625rem}.pagination .disabled{color:#cacaca;cursor:not-allowed;padding:.1875rem .625rem}.pagination .disabled:hover{background:0 0}.pagination .ellipsis:after{color:#0a0a0a;content:"…";padding:.1875rem .625rem}.pagination-previous a:before,.pagination-previous.disabled:before{content:"«";display:inline-block;margin-right:.5rem}.pagination-next a:after,.pagination-next.disabled:after{content:"»";display:inline-block;margin-left:.5rem}.has-tip{border-bottom:1px dotted #8a8a8a;cursor:help;display:inline-block;font-weight:700;position:relative}.tooltip{background-color:#0a0a0a;border-radius:0;color:#fefefe;font-size:80%;max-width:10rem;padding:.75rem;top:calc(100% + .6495rem);z-index:1200}.tooltip,.tooltip:before{position:absolute}.tooltip.bottom:before{border-color:transparent transparent #0a0a0a;border-style:solid;border-width:0 .75rem .75rem;bottom:100%;content:"";display:block;height:0;width:0}.tooltip.bottom.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.top:before{border-color:#0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem 0;bottom:auto;content:"";display:block;height:0;top:100%;width:0}.tooltip.top.align-center:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.tooltip.left:before{border-color:transparent transparent transparent #0a0a0a;border-style:solid;border-width:.75rem 0 .75rem .75rem;content:"";display:block;height:0;left:100%;width:0}.tooltip.left.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.right:before{border-color:transparent #0a0a0a transparent transparent;border-style:solid;border-width:.75rem .75rem .75rem 0;content:"";display:block;height:0;left:auto;right:100%;width:0}.tooltip.right.align-center:before{bottom:auto;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.tooltip.align-top:before{bottom:auto;top:10%}.tooltip.align-bottom:before{bottom:10%;top:auto}.tooltip.align-left:before{left:10%;right:auto}.tooltip.align-right:before{left:auto;right:10%}.accordion{background:#fefefe;list-style-type:none;margin-left:0}.accordion[disabled] .accordion-title{cursor:not-allowed}.accordion-item:first-child>:first-child,.accordion-item:last-child>:last-child{border-radius:0}.accordion-title{border:1px solid #e6e6e6;border-bottom:0;color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1rem;position:relative}:last-child:not(.is-active)>.accordion-title{border-bottom:1px solid #e6e6e6;border-radius:0}.accordion-title:focus,.accordion-title:hover{background-color:#e6e6e6}.accordion-title:before{content:"+";margin-top:-.5rem;position:absolute;right:1rem;top:50%}.is-active>.accordion-title:before{content:"–"}.accordion-content{background-color:#fefefe;border:1px solid #e6e6e6;border-bottom:0;color:#0a0a0a;display:none;padding:1rem}:last-child>.accordion-content:last-child{border-bottom:1px solid #e6e6e6}.media-object{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin-bottom:1rem}.media-object img{max-width:none}@media print,screen and (max-width:39.99875em){.media-object.stack-for-small{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}}.media-object-section{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.media-object-section:first-child{padding-right:1rem}.media-object-section:last-child:not(:nth-child(2)){padding-left:1rem}.media-object-section>:last-child{margin-bottom:0}@media print,screen and (max-width:39.99875em){.stack-for-small .media-object-section{-ms-flex-preferred-size:100%;-webkit-flex-basis:100%;flex-basis:100%;max-width:100%;padding:0 0 1rem}.stack-for-small .media-object-section img{width:100%}}.media-object-section.main-section{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.orbit,.orbit-container{position:relative}.orbit-container{height:0;list-style:none;margin:0;overflow:hidden}.orbit-slide{position:absolute;width:100%}.orbit-slide.no-motionui.is-active{left:0;top:0}.orbit-figure{margin:0}.orbit-image{margin:0;max-width:100%;width:100%}.orbit-caption{background-color:hsla(0,0%,4%,.5);bottom:0;margin-bottom:0;width:100%}.orbit-caption,.orbit-next,.orbit-previous{color:#fefefe;padding:1rem;position:absolute}.orbit-next,.orbit-previous{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:10}[data-whatinput=mouse] .orbit-next,[data-whatinput=mouse] .orbit-previous{outline:0}.orbit-next:active,.orbit-next:focus,.orbit-next:hover,.orbit-previous:active,.orbit-previous:focus,.orbit-previous:hover{background-color:hsla(0,0%,4%,.5)}.orbit-previous{left:0}.orbit-next{left:auto;right:0}.orbit-bullets{margin-bottom:.8rem;margin-top:.8rem;position:relative;text-align:center}[data-whatinput=mouse] .orbit-bullets{outline:0}.orbit-bullets button{background-color:#cacaca;border-radius:50%;height:1.2rem;margin:.1rem;width:1.2rem}.orbit-bullets button.is-active,.orbit-bullets button:hover{background-color:#8a8a8a}.flex-video,.responsive-embed{height:0;margin-bottom:1rem;overflow:hidden;padding-bottom:75%;position:relative}.flex-video embed,.flex-video iframe,.flex-video object,.flex-video video,.responsive-embed embed,.responsive-embed iframe,.responsive-embed object,.responsive-embed video{height:100%;left:0;position:absolute;top:0;width:100%}.flex-video.widescreen,.responsive-embed.widescreen{padding-bottom:56.25%}.tabs{background:#fefefe;border:1px solid #e6e6e6;list-style-type:none;margin:0}.tabs:after,.tabs:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.tabs:after{clear:both}.tabs.vertical>li{display:block;float:none;width:auto}.tabs.simple>li>a{padding:0}.tabs.simple>li>a:hover{background:0 0}.tabs.primary{background:#1779ba}.tabs.primary>li>a{color:#fefefe}.tabs.primary>li>a:focus,.tabs.primary>li>a:hover{background:#1673b1}.tabs-title{float:left}.tabs-title>a{color:#1779ba;display:block;font-size:.75rem;line-height:1;padding:1.25rem 1.5rem}[data-whatinput=mouse] .tabs-title>a{outline:0}.tabs-title>a:hover{background:#fefefe;color:#1468a0}.tabs-title>a:focus,.tabs-title>a[aria-selected=true]{background:#e6e6e6;color:#1779ba}.tabs-content{background:#fefefe;border:1px solid #e6e6e6;border-top:0;color:#0a0a0a;-webkit-transition:all .5s ease;transition:all .5s ease}.tabs-content.vertical{border:1px solid #e6e6e6;border-left:0}.tabs-panel{display:none;padding:1rem}.tabs-panel.is-active{display:block}.thumbnail{border:4px solid #fefefe;border-radius:0;-webkit-box-shadow:0 0 0 1px hsla(0,0%,4%,.2);box-shadow:0 0 0 1px hsla(0,0%,4%,.2);display:inline-block;line-height:0;margin-bottom:1rem;max-width:100%}a.thumbnail{-webkit-transition:-webkit-box-shadow .2s ease-out;transition:-webkit-box-shadow .2s ease-out;transition:box-shadow .2s ease-out;transition:box-shadow .2s ease-out,-webkit-box-shadow .2s ease-out}a.thumbnail:focus,a.thumbnail:hover{-webkit-box-shadow:0 0 6px 1px rgba(23,121,186,.5);box-shadow:0 0 6px 1px rgba(23,121,186,.5)}a.thumbnail image{-webkit-box-shadow:none;box-shadow:none}.menu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;margin:0;padding:0;position:relative}[data-whatinput=mouse] .menu li{outline:0}.menu .button,.menu a{display:block;line-height:1;padding:.7rem 1rem;text-decoration:none}.menu a,.menu button,.menu input,.menu select{margin-bottom:0}.menu input{display:inline-block}.menu,.menu.horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.vertical.icon-bottom li a i,.menu.vertical.icon-bottom li a img,.menu.vertical.icon-bottom li a svg,.menu.vertical.icon-top li a i,.menu.vertical.icon-top li a img,.menu.vertical.icon-top li a svg{text-align:left}.menu.expanded li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.menu.expanded.icon-bottom li a i,.menu.expanded.icon-bottom li a img,.menu.expanded.icon-bottom li a svg,.menu.expanded.icon-top li a i,.menu.expanded.icon-top li a img,.menu.expanded.icon-top li a svg{text-align:left}.menu.simple{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.menu.simple li+li{margin-left:1rem}.menu.simple a{padding:0}@media print,screen and (min-width:40em){.menu.medium-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.medium-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.medium-expanded li,.menu.medium-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}@media print,screen and (min-width:64em){.menu.large-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.menu.large-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.menu.large-expanded li,.menu.large-simple li{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}}.menu.nested{margin-left:1rem;margin-right:0}.menu.icon-bottom a,.menu.icon-left a,.menu.icon-right a,.menu.icon-top a,.menu.icons a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu.icon-left li a,.menu.nested.icon-left li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-left li a i,.menu.icon-left li a img,.menu.icon-left li a svg,.menu.nested.icon-left li a i,.menu.nested.icon-left li a img,.menu.nested.icon-left li a svg{margin-right:.25rem}.menu.icon-right li a,.menu.nested.icon-right li a{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap}.menu.icon-right li a i,.menu.icon-right li a img,.menu.icon-right li a svg,.menu.nested.icon-right li a i,.menu.nested.icon-right li a img,.menu.nested.icon-right li a svg{margin-left:.25rem}.menu.icon-top li a,.menu.nested.icon-top li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-top li a i,.menu.icon-top li a img,.menu.icon-top li a svg,.menu.nested.icon-top li a i,.menu.nested.icon-top li a img,.menu.nested.icon-top li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu.icon-bottom li a,.menu.nested.icon-bottom li a{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-flow:column nowrap;-ms-flex-flow:column nowrap;flex-flow:column nowrap}.menu.icon-bottom li a i,.menu.icon-bottom li a img,.menu.icon-bottom li a svg,.menu.nested.icon-bottom li a i,.menu.nested.icon-bottom li a img,.menu.nested.icon-bottom li a svg{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch;margin-bottom:.25rem;text-align:center}.menu .active>a,.menu .is-active>a{background:#1779ba;color:#fefefe}.menu.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right li{-webkit-box-pack:end;-ms-flex-pack:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-end;justify-content:flex-end}.menu.align-right li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu.align-right.vertical li{display:block;text-align:right}.menu.align-right.icon-bottom li a i,.menu.align-right.icon-bottom li a img,.menu.align-right.icon-bottom li a svg,.menu.align-right.icon-top li a i,.menu.align-right.icon-top li a img,.menu.align-right.icon-top li a svg,.menu.align-right.vertical li .submenu li{text-align:right}.menu.align-right .nested{margin-left:0;margin-right:1rem}.menu.align-center li{-webkit-box-pack:center;-ms-flex-pack:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;justify-content:center}.menu.align-center li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.menu .menu-text{color:inherit;font-weight:700;line-height:1;padding:.7rem 1rem}.menu-centered>.menu,.menu-centered>.menu li{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.menu-centered>.menu li{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-centered>.menu li .submenu li{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.no-js [data-responsive-menu] ul{display:none}.menu-icon{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon:after{background:#fefefe;-webkit-box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;box-shadow:0 7px 0 #fefefe,0 14px 0 #fefefe;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon:hover:after{background:#cacaca;-webkit-box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca;box-shadow:0 7px 0 #cacaca,0 14px 0 #cacaca}.menu-icon.dark{cursor:pointer;display:inline-block;height:16px;position:relative;vertical-align:middle;width:20px}.menu-icon.dark:after{background:#0a0a0a;-webkit-box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;box-shadow:0 7px 0 #0a0a0a,0 14px 0 #0a0a0a;content:"";display:block;height:2px;left:0;position:absolute;top:0;width:100%}.menu-icon.dark:hover:after{background:#8a8a8a;-webkit-box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a;box-shadow:0 7px 0 #8a8a8a,0 14px 0 #8a8a8a}.accordion-menu li{width:100%}.accordion-menu .is-accordion-submenu a,.accordion-menu a{padding:.7rem 1rem}.accordion-menu .nested.is-accordion-submenu{margin-left:1rem;margin-right:0}.accordion-menu.align-right .nested.is-accordion-submenu{margin-left:0;margin-right:1rem}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a{position:relative}.accordion-menu .is-accordion-submenu-parent:not(.has-submenu-toggle)>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;margin-top:-3px;position:absolute;right:1rem;top:50%;width:0}.accordion-menu.align-left .is-accordion-submenu-parent>a:after{left:auto;right:1rem}.accordion-menu.align-right .is-accordion-submenu-parent>a:after{left:1rem;right:auto}.accordion-menu .is-accordion-submenu-parent[aria-expanded=true]>a:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.is-accordion-submenu-parent{position:relative}.has-submenu-toggle>a{margin-right:40px}.submenu-toggle{cursor:pointer;height:40px;position:absolute;right:0;top:0;width:40px}.submenu-toggle:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;bottom:0;content:"";display:block;height:0;margin:auto;top:0;width:0}.submenu-toggle[aria-expanded=true]:after{-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.submenu-toggle-text{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.is-drilldown{overflow:hidden;position:relative}.is-drilldown li{display:block}.is-drilldown.animate-height{-webkit-transition:height .5s;transition:height .5s}.drilldown a{background:#fefefe;padding:.7rem 1rem}.drilldown .is-drilldown-submenu{background:#fefefe;left:100%;position:absolute;top:0;-webkit-transition:-webkit-transform .15s linear;transition:-webkit-transform .15s linear;transition:transform .15s linear;transition:transform .15s linear,-webkit-transform .15s linear;width:100%;z-index:-1}.drilldown .is-drilldown-submenu.is-active{display:block;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);z-index:1}.drilldown .is-drilldown-submenu.is-closing{-webkit-transform:translateX(100%);-ms-transform:translateX(100%);transform:translateX(100%)}.drilldown .is-drilldown-submenu a{padding:.7rem 1rem}.drilldown .nested.is-drilldown-submenu{margin-left:0;margin-right:0}.drilldown .drilldown-submenu-cover-previous{min-height:100%}.drilldown .is-drilldown-submenu-parent>a{position:relative}.drilldown .is-drilldown-submenu-parent>a:after{margin-top:-6px;position:absolute;top:50%}.drilldown .is-drilldown-submenu-parent>a:after,.drilldown.align-left .is-drilldown-submenu-parent>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;right:1rem;width:0}.drilldown.align-left .is-drilldown-submenu-parent>a:after{left:auto}.drilldown.align-right .is-drilldown-submenu-parent>a:after{left:1rem;right:auto}.drilldown .js-drilldown-back>a:before,.drilldown.align-right .is-drilldown-submenu-parent>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;width:0}.drilldown .js-drilldown-back>a:before{display:inline-block;margin-right:.75rem;vertical-align:middle}.dropdown.menu>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}[data-whatinput=mouse] .dropdown.menu a{outline:0}.dropdown.menu>li>a{padding:.7rem 1rem}.dropdown.menu>li.is-active>a{background:0 0;color:#1779ba}.no-js .dropdown.menu ul{display:none}.dropdown.menu .nested.is-dropdown-submenu{margin-left:0;margin-right:0}.dropdown.menu.vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.vertical>li>a:after{right:14px}.dropdown.menu.vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}@media print,screen and (min-width:40em){.dropdown.menu.medium-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.medium-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.medium-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.medium-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.medium-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.medium-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.medium-vertical>li>a:after{right:14px}.dropdown.menu.medium-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.medium-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}@media print,screen and (min-width:64em){.dropdown.menu.large-horizontal>li.opens-left>.is-dropdown-submenu{left:auto;right:0;top:100%}.dropdown.menu.large-horizontal>li.opens-right>.is-dropdown-submenu{left:0;right:auto;top:100%}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a{padding-right:1.5rem;position:relative}.dropdown.menu.large-horizontal>li.is-dropdown-submenu-parent>a:after{border-color:#1779ba transparent transparent;border-style:solid;border-width:6px 6px 0;content:"";display:block;height:0;left:auto;margin-top:-3px;right:5px;width:0}.dropdown.menu.large-vertical>li .is-dropdown-submenu{top:0}.dropdown.menu.large-vertical>li.opens-left>.is-dropdown-submenu{left:auto;right:100%;top:0}.dropdown.menu.large-vertical>li.opens-right>.is-dropdown-submenu{left:100%;right:auto}.dropdown.menu.large-vertical>li>a:after{right:14px}.dropdown.menu.large-vertical>li.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.dropdown.menu.large-vertical>li.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}}.dropdown.menu.align-right .is-dropdown-submenu.first-sub{left:auto;right:0;top:100%}.is-dropdown-menu.vertical{width:100px}.is-dropdown-menu.vertical.align-right{float:right}.is-dropdown-submenu-parent{position:relative}.is-dropdown-submenu-parent a:after{left:auto;margin-top:-6px;position:absolute;right:5px;top:50%}.is-dropdown-submenu-parent.opens-inner>.is-dropdown-submenu{left:auto;top:100%}.is-dropdown-submenu-parent.opens-left>.is-dropdown-submenu{left:auto;right:100%}.is-dropdown-submenu-parent.opens-right>.is-dropdown-submenu{left:100%;right:auto}.is-dropdown-submenu{background:#fefefe;border:1px solid #cacaca;display:none;left:100%;min-width:200px;position:absolute;top:0;z-index:1}.dropdown .is-dropdown-submenu a{padding:.7rem 1rem}.is-dropdown-submenu .is-dropdown-submenu-parent>a:after{right:14px}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-left>a:after{border-color:transparent #1779ba transparent transparent;border-style:solid;border-width:6px 6px 6px 0;content:"";display:block;height:0;left:5px;right:auto;width:0}.is-dropdown-submenu .is-dropdown-submenu-parent.opens-right>a:after{border-color:transparent transparent transparent #1779ba;border-style:solid;border-width:6px 0 6px 6px;content:"";display:block;height:0;width:0}.is-dropdown-submenu .is-dropdown-submenu{margin-top:-1px}.is-dropdown-submenu>li{width:100%}.is-dropdown-submenu.js-dropdown-active{display:block}.is-off-canvas-open{overflow:hidden}.js-off-canvas-overlay{background:hsla(0,0%,100%,.25);height:100%;left:0;opacity:0;overflow:hidden;position:absolute;top:0;-webkit-transition:opacity .5s ease,visibility .5s ease;transition:opacity .5s ease,visibility .5s ease;visibility:hidden;width:100%;z-index:11}.js-off-canvas-overlay.is-visible{opacity:1;visibility:visible}.js-off-canvas-overlay.is-closable{cursor:pointer}.js-off-canvas-overlay.is-overlay-absolute{position:absolute}.js-off-canvas-overlay.is-overlay-fixed{position:fixed}.off-canvas-wrapper{overflow:hidden;position:relative}.off-canvas{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:fixed;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas{outline:0}.off-canvas.is-transition-push{z-index:12}.off-canvas.is-closed{visibility:hidden}.off-canvas.is-transition-overlap{z-index:13}.off-canvas.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-absolute{-webkit-backface-visibility:hidden;backface-visibility:hidden;background:#e6e6e6;position:absolute;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:12}[data-whatinput=mouse] .off-canvas-absolute{outline:0}.off-canvas-absolute.is-transition-push{z-index:12}.off-canvas-absolute.is-closed{visibility:hidden}.off-canvas-absolute.is-transition-overlap{z-index:13}.off-canvas-absolute.is-transition-overlap.is-open{-webkit-box-shadow:0 0 10px hsla(0,0%,4%,.7);box-shadow:0 0 10px hsla(0,0%,4%,.7)}.off-canvas-absolute.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.position-left{-webkit-overflow-scrolling:touch;height:100%;left:0;overflow-y:auto;top:0;width:250px}.off-canvas-content .off-canvas.position-left,.position-left{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.off-canvas-content .off-canvas.position-left.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-left.has-transition-push{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.position-left.is-transition-push{-webkit-box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset -13px 0 20px -13px hsla(0,0%,4%,.25)}.position-right{-webkit-overflow-scrolling:touch;height:100%;overflow-y:auto;right:0;top:0;width:250px}.off-canvas-content .off-canvas.position-right,.position-right{-webkit-transform:translateX(250px);-ms-transform:translateX(250px);transform:translateX(250px)}.off-canvas-content .off-canvas.position-right.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-right.has-transition-push{-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px)}.position-right.is-transition-push{-webkit-box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 13px 0 20px -13px hsla(0,0%,4%,.25)}.position-top{-webkit-overflow-scrolling:touch;height:250px;left:0;overflow-x:auto;top:0;width:100%}.off-canvas-content .off-canvas.position-top,.position-top{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.off-canvas-content .off-canvas.position-top.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-top.has-transition-push{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.position-top.is-transition-push{-webkit-box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 -13px 20px -13px hsla(0,0%,4%,.25)}.position-bottom{-webkit-overflow-scrolling:touch;bottom:0;height:250px;left:0;overflow-x:auto;width:100%}.off-canvas-content .off-canvas.position-bottom,.position-bottom{-webkit-transform:translateY(250px);-ms-transform:translateY(250px);transform:translateY(250px)}.off-canvas-content .off-canvas.position-bottom.is-transition-overlap.is-open{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}.off-canvas-content.is-open-bottom.has-transition-push{-webkit-transform:translateY(-250px);-ms-transform:translateY(-250px);transform:translateY(-250px)}.position-bottom.is-transition-push{-webkit-box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25);box-shadow:inset 0 13px 20px -13px hsla(0,0%,4%,.25)}.off-canvas-content{-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-transition-overlap,.off-canvas-content.has-transition-push{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.off-canvas-content .off-canvas.is-open,.off-canvas-content.has-transition-push{-webkit-transform:translate(0);-ms-transform:translate(0);transform:translate(0)}@media print,screen and (min-width:40em){.position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-medium .close-button{display:none}.off-canvas-content .position-left.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-medium~.off-canvas-content{margin-left:250px}.position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-medium .close-button{display:none}.off-canvas-content .position-right.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-medium~.off-canvas-content{margin-right:250px}.position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-medium .close-button{display:none}.off-canvas-content .position-top.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-medium~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-medium .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-medium{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-medium~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:64em){.position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-left.reveal-for-large .close-button{display:none}.off-canvas-content .position-left.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-left,.position-left.reveal-for-large~.off-canvas-content{margin-left:250px}.position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-right.reveal-for-large .close-button{display:none}.off-canvas-content .position-right.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-right,.position-right.reveal-for-large~.off-canvas-content{margin-right:250px}.position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-top.reveal-for-large .close-button{display:none}.off-canvas-content .position-top.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-top,.position-top.reveal-for-large~.off-canvas-content{margin-top:250px}.position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none;-webkit-transition:none;transition:none;visibility:visible;z-index:12}.position-bottom.reveal-for-large .close-button{display:none}.off-canvas-content .position-bottom.reveal-for-large{-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas-content.has-reveal-bottom,.position-bottom.reveal-for-large~.off-canvas-content{margin-bottom:250px}}@media print,screen and (min-width:40em){.off-canvas.in-canvas-for-medium{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-medium.position-bottom,.off-canvas.in-canvas-for-medium.position-left,.off-canvas.in-canvas-for-medium.position-right,.off-canvas.in-canvas-for-medium.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-medium .close-button{display:none}}@media print,screen and (min-width:64em){.off-canvas.in-canvas-for-large{background:0 0;height:auto;overflow:visible;position:static;-webkit-transition:none;transition:none;visibility:visible;width:auto}.off-canvas.in-canvas-for-large.position-bottom,.off-canvas.in-canvas-for-large.position-left,.off-canvas.in-canvas-for-large.position-right,.off-canvas.in-canvas-for-large.position-top{-webkit-box-shadow:none;box-shadow:none;-webkit-transform:none;-ms-transform:none;transform:none}.off-canvas.in-canvas-for-large .close-button{display:none}}html.is-reveal-open{overflow-y:hidden;position:fixed;width:100%}html.is-reveal-open.zf-has-scroll{-webkit-overflow-scrolling:touch;overflow-y:scroll}html.is-reveal-open body{overflow-y:hidden}.reveal-overlay{background-color:hsla(0,0%,4%,.45);bottom:0;left:0;position:fixed;right:0;top:0;z-index:1005}.reveal,.reveal-overlay{-webkit-overflow-scrolling:touch;display:none;overflow-y:auto}.reveal{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fefefe;border:1px solid #cacaca;border-radius:0;margin-left:auto;margin-right:auto;padding:1rem;position:relative;top:100px;z-index:1006}[data-whatinput=mouse] .reveal{outline:0}@media print,screen and (min-width:40em){.reveal{min-height:0}}.reveal .column{min-width:0}.reveal>:last-child{margin-bottom:0}@media print,screen and (min-width:40em){.reveal{max-width:75rem;width:600px}}.reveal.collapse{padding:0}@media print,screen and (min-width:40em){.reveal.tiny{max-width:75rem;width:30%}.reveal.small{max-width:75rem;width:50%}.reveal.large{max-width:75rem;width:90%}}.reveal.full{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}@media print,screen and (max-width:39.99875em){.reveal{border:0;border-radius:0;bottom:0;height:100%;left:0;margin-left:0;max-width:none;min-height:100%;right:0;top:0;width:100%}}.reveal.without-overlay{position:fixed}.sticky,.sticky-container{position:relative}.sticky{-webkit-transform:translateZ(0);transform:translateZ(0);z-index:0}.sticky.is-stuck{position:fixed;width:100%;z-index:5}.sticky.is-stuck.is-at-top{top:0}.sticky.is-stuck.is-at-bottom{bottom:0}.sticky.is-anchored{left:auto;position:relative;right:auto}.sticky.is-anchored.is-at-bottom{bottom:0}.title-bar{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;background:#0a0a0a;color:#fefefe;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;padding:.5rem}.title-bar .menu-icon{margin-left:.25rem;margin-right:.25rem}.title-bar-left,.title-bar-right{-webkit-box-flex:1;-webkit-flex:1 1 0px;-ms-flex:1 1 0px;flex:1 1 0px}.title-bar-right{text-align:right}.title-bar-title{display:inline-block;font-weight:700;vertical-align:middle}.top-bar{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-between;justify-content:space-between;padding:.5rem}.top-bar,.top-bar ul{background-color:#e6e6e6}.top-bar input{margin-right:1rem;max-width:200px}.top-bar .input-group-field{margin-right:0;width:100%}.top-bar input.button{width:auto}.top-bar .top-bar-left,.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}@media print,screen and (min-width:40em){.top-bar{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.top-bar .top-bar-left{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;margin-right:auto}.top-bar .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-left:auto}}@media print,screen and (max-width:63.99875em){.top-bar.stacked-for-medium{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-medium .top-bar-left,.top-bar.stacked-for-medium .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}@media print,screen and (max-width:74.99875em){.top-bar.stacked-for-large{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.top-bar.stacked-for-large .top-bar-left,.top-bar.stacked-for-large .top-bar-right{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}}.top-bar-title{margin:.5rem 1rem .5rem 0}.top-bar-left,.top-bar-right,.top-bar-title{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.float-left{float:left!important}.float-right{float:right!important}.float-center{display:block;margin-left:auto;margin-right:auto}.clearfix:after,.clearfix:before{-ms-flex-preferred-size:0;-webkit-box-ordinal-group:2;-ms-flex-order:1;content:" ";display:table;-webkit-flex-basis:0;flex-basis:0;-webkit-order:1;order:1}.clearfix:after{clear:both}.align-left{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-justify{-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.align-spaced{-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around}.align-left.vertical.menu>li>a{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.align-right.vertical.menu>li>a{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.align-center.vertical.menu>li>a{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.align-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start}.align-self-top{-ms-flex-item-align:start;-webkit-align-self:flex-start;align-self:flex-start}.align-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;align-items:flex-end}.align-self-bottom{-ms-flex-item-align:end;-webkit-align-self:flex-end;align-self:flex-end}.align-middle{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center}.align-self-middle{-ms-flex-item-align:center;-webkit-align-self:center;align-self:center}.align-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;align-items:stretch}.align-self-stretch{-ms-flex-item-align:stretch;-webkit-align-self:stretch;align-self:stretch}.align-center-middle{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-box-align:center;-ms-flex-align:center;-ms-flex-line-pack:center;-webkit-align-content:center;align-content:center;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.small-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.small-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.small-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.small-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.small-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.small-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}@media print,screen and (min-width:40em){.medium-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.medium-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.medium-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.medium-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.medium-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.medium-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}@media print,screen and (min-width:64em){.large-order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;-webkit-order:1;order:1}.large-order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;-webkit-order:2;order:2}.large-order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;-webkit-order:3;order:3}.large-order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;-webkit-order:4;order:4}.large-order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;-webkit-order:5;order:5}.large-order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;-webkit-order:6;order:6}}.flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}@media print,screen and (min-width:40em){.medium-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.medium-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.medium-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.medium-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.medium-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.medium-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.medium-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.medium-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}@media print,screen and (min-width:64em){.large-flex-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.large-flex-child-auto{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto}.large-flex-child-grow{-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}.large-flex-child-shrink{-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto}.large-flex-dir-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.large-flex-dir-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.large-flex-dir-column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.large-flex-dir-column-reverse{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}}.hide{display:none!important}.invisible{visibility:hidden}.visible{visibility:visible}@media print,screen and (max-width:39.99875em){.hide-for-small-only{display:none!important}}@media screen and (max-width:0em),screen and (min-width:40em){.show-for-small-only{display:none!important}}@media print,screen and (min-width:40em){.hide-for-medium{display:none!important}}@media screen and (max-width:39.99875em){.show-for-medium{display:none!important}}@media print,screen and (min-width:40em)and (max-width:63.99875em){.hide-for-medium-only{display:none!important}}@media screen and (max-width:39.99875em),screen and (min-width:64em){.show-for-medium-only{display:none!important}}@media print,screen and (min-width:64em){.hide-for-large{display:none!important}}@media screen and (max-width:63.99875em){.show-for-large{display:none!important}}@media print,screen and (min-width:64em)and (max-width:74.99875em){.hide-for-large-only{display:none!important}}@media screen and (max-width:63.99875em),screen and (min-width:75em){.show-for-large-only{display:none!important}}.show-for-sr,.show-on-focus{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}.show-on-focus:active,.show-on-focus:focus{clip:auto!important;height:auto!important;overflow:visible!important;position:static!important;white-space:normal!important;width:auto!important}.hide-for-portrait,.show-for-landscape{display:block!important}@media screen and (orientation:landscape){.hide-for-portrait,.show-for-landscape{display:block!important}}@media screen and (orientation:portrait){.hide-for-portrait,.show-for-landscape{display:none!important}}.hide-for-landscape,.show-for-portrait{display:none!important}@media screen and (orientation:landscape){.hide-for-landscape,.show-for-portrait{display:none!important}}@media screen and (orientation:portrait){.hide-for-landscape,.show-for-portrait{display:block!important}}.show-for-dark-mode{display:none}.hide-for-dark-mode{display:block}@media screen and (prefers-color-scheme:dark){.show-for-dark-mode{display:block!important}.hide-for-dark-mode{display:none!important}}.show-for-ie{display:none}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.show-for-ie{display:block!important}.hide-for-ie{display:none!important}}.show-for-sticky{display:none}.is-stuck .show-for-sticky{display:block}.is-stuck .hide-for-sticky{display:none}@font-face{font-display:"swap";font-family:FontAwesome}html{box-sizing:border-box;scroll-padding-top:100px}body{font-family:Roboto,sans-serif;font-size:16px;line-height:1}*,:after,:before{box-sizing:inherit}a{color:#3c4fe0}a.reference:after{font-family:FontAwesome;font-size:12px;padding:0 4px}a.reference.external:after{content:""}a.reference.download:after{content:""}a:hover{color:#3c4fe0;font-weight:500}.headerlink{margin-left:5px;visibility:hidden}.toc-backref:hover{color:#23263b}h1,h2,h3,h4,h5,h6{font-family:Roboto,sans-serif;font-size:16px;font-weight:500;letter-spacing:.2px;line-height:24px;margin-bottom:16px}h1:hover>a.headerlink,h2:hover>a.headerlink,h3:hover>a.headerlink,h4:hover>a.headerlink,h5:hover>a.headerlink,h6:hover>a.headerlink{visibility:visible}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{color:inherit}h1{font-size:32px;font-weight:700;line-height:40px;margin-bottom:28px}h2{font-size:24px;line-height:32px}h3{font-size:20px}h4{font-size:18px}h5{font-size:16px}h6{font-weight:400}img{max-width:100%}button:focus{outline:0}blockquote{border:0;margin:0;padding:0}blockquote,blockquote p,cite{color:inherit}cite{display:inline;font-size:inherit}cite:before{content:""}.show{display:block!important}.centered{display:block;margin:0 auto}.break{flex-basis:100%;height:0}@media screen and (min-width:1024px){h1{font-size:36px}}.admonition-title:before,.contents.local>ul>li a:before,.scylla-icon,.secondary-side-nav__content li a:before{background-repeat:no-repeat;background-size:contain;display:inline-block;filter:brightness(0);vertical-align:middle}.scylla-icon--about-team{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjY2IDkuODEgMi42MyAxMWEyLjA4IDIuMDggMCAwIDAtMS4xMyAxLjgzdjcuODFjLjE5IDEuMTEuNSAxLjUzIDEuNSAxLjQ3TTcuMDYgOS45NGwxLjQ0Ljk0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMy41IDE4LjV2NS4zNE05LjUgMTguNXY1LjM0TTguNTQgMTguNDJ2NS4zM00xNS41IDE4LjV2NS4zNE0xNi41IDE4LjV2NS4zNE0zLjMzIDIwLjUzaDUuMDhNMTEuNDUgOC44NGwuMDYuMDZhMS42NSAxLjY1IDAgMCAwIDIuMzQgMGgwIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTIuNDIgNy41YTEuODEgMS44MSAwIDAgMS0xLjkyLTEuNzdWNWExLjk0IDEuOTQgMCAwIDEgMS45Mi0yIDIuMDcgMi4wNyAwIDAgMSAyLjA4IDJ2Ljc3YTIgMiAwIDAgMS0yLjA4IDEuNzNaTTExLjQyIDguNzQgOS42MyA5LjlhMi4wNyAyLjA3IDAgMCAwLTEuMTMgMS44NXY3LjgyQTEuNDcgMS40NyAwIDAgMCAxMCAyMU0xMy43NSA5LjE4bDIgLjY1Yy43LjM1Ljc2IDEuMDYuNzYgMS44NHY3LjljMCAuNzctLjIzIDEuMjQtMSAxLjI0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOS45MyAxOS41aDUuNCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTE5LjQyIDkuMTJhMi4wNyAyLjA3IDAgMCAwIDIuMDgtMS45M3YtLjc3YTIuMDcgMi4wNyAwIDAgMC0yLjA4LTEuOTIgMS45MyAxLjkzIDAgMCAwLTEuOTIgMS45MnYuNzdhMS45NCAxLjk0IDAgMCAwIDEuOTIgMS45M1pNNS41OSA5LjEyYTEuOTMgMS45MyAwIDAgMCAxLjkyLTEuOTN2LS43N0ExLjkzIDEuOTMgMCAwIDAgNS41OSA0LjUgMi4wOCAyLjA4IDAgMCAwIDMuNSA2LjQydi43N2EyLjA4IDIuMDggMCAwIDAgMi4wOSAxLjkzWk0yMC40NCA5LjgxbDIgMS4xN2EyLjA2IDIuMDYgMCAwIDEgMS4xMyAxLjg1djcuODFjLS4xOCAxLjExLS40NyAxLjUzLTEuNDcgMS40N00xOC4wNCA5Ljk0bC0xLjQ0LjkzIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjEuNiAxOC41djUuMzRNMjEuNzcgMjAuNTNoLTUuMDgiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--about-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6LjhweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNi4yOCAxOS40OGMtLjEyLjA4LS4wOC4wNy0uMjMuMS0uNTguMDktMS4xMi0uMjgtMS4yNS0uODQgMCAwLTIuMy05LjE4LTIuMy0xMS4xMUMyLjUgMy42IDUuODguNDQgMTAuMzguNDRTMTcuNSAzLjQ4IDE3LjUgNy41YzAgMS45My0xLjMyIDExLjIzLTEuMzIgMTEuMjMtLjEzLjU2LS42Ny45NC0xLjI1Ljg0LS4xMi0uMDItLjEzIDAtLjIzLS4wNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1Ljc1IDE1Ljc1Yy0uMTcgMS4xNS0uMjIgMi4zNC0uNTUgMy40Ni0uMzcuODUtMS42MyAxLjA2LTIuMjIuMzMtLjI1LS4yOC4xOS0uNjguNDQtLjQuNDMuNDYgMS4yNC4xOCAxLjMxLS40NGwuMDYtLjM0Yy4xOS0uODkuMzUtMS43OS41Ny0yLjY4LjA1LS4yNC40Mi0uMTcuMzkuMDdaIi8+PHBhdGggZD0iTTExLjUgN2MwIDEuOS0xLjU2IDMuNS0zLjQ2IDMuNVM0LjUgOC45IDQuNSA3czEuNjQtMy41IDMuNTQtMy41UzExLjUgNS4xIDExLjUgN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik04LjU1IDQuNzVjLS41OS4xMi0uNzEgMS40Mi0uMzYgMS43OC4yMy4yMy43MS4zMS43MS40N3MtLjQ4LjI0LS43MS40N2MtLjM2LjM2LS4yNCAxLjY2LjM2IDEuNzguNzEuMTQgMS43OC0uNzEgMS43OC0yLjI1UzkuMjYgNC42MSA4LjU1IDQuNzVaTTYuNTEgMTIuMmMyLjEyLjMxIDQuMzQtLjIgNS42OC0xLjk2LjMyLS40MS45Ni4xMS42Mi41MS0uNzYuOS0xLjc4IDEuNjMtMi45MyAxLjk1LTEuMTQuMzMtMi4zMy4zMS0zLjQ2LjE2YS4zNC4zNCAwIDAgMS0uMjktLjM4Yy4wMi0uMTguMTktLjMxLjM3LS4yOVpNNy45NyAxOS41OWMtLjk5Ljk2LTIuMzYuMDgtMi4zNi0xLjE1LS4xMi0uOS0uMjctMS43OS0uMzctMi42OS0uMDEtLjExLjA3LS4yMS4xOC0uMjIuMS0uMDEuMTkuMDYuMjEuMTUuMjIuODguMzggMS43Ny41NiAyLjY2LjAxLjc4LjY4IDEuMzggMS4zNS44My4yNy0uMjcuNjkuMTYuNDIuNDNaIi8+PHBhdGggZD0iTTkuNzUgMTkuMjdjLS40Mi45LTEuOC45Ni0yLjMyLjExLS41LTEuMTMtLjMxLTIuNS0uNDctMy43MiAwLS4xMS4wOC0uMi4xOS0uMjEuMSAwIC4xOS4wNy4yMS4xNy4xNy45NS4yOCAxLjkxLjQyIDIuODcuMDEuNDUuMjMuNzQuNTcuODUuMzMuMS43MS0uMDUuODgtLjM2LjE4LS4zNC43MS0uMDUuNTIuMjlaTTE0LjAzIDE1LjY2Yy0uMTYgMS4yMy4wMyAyLjU3LS40NiAzLjcyLS41Mi44Ni0xLjkxLjc5LTIuMzItLjExLS4xNy0uMzQuMzUtLjYxLjUzLS4yOC40Mi43MSAxLjQ4LjM4IDEuNDUtLjQ5LjE0LS45Ni4yNS0xLjkyLjQyLTIuODcuMDQtLjI0LjQxLS4yLjQuMDRaIi8+PHBhdGggZD0iTTExLjg1IDE1LjU0Yy4wMi43OS4wMSAxLjU4LjAxIDIuMzctLjAyLjQxLjA3LjktLjE0IDEuMjktLjQzIDEuMDItMi4wMSAxLjAyLTIuNDUgMC0uMjEtLjM5LS4xMy0uODktLjE0LTEuMjkgMC0uNzkgMC0xLjU4LjAxLTIuMzcgMC0uMTEuMS0uMi4yMS0uMTkuMSAwIC4xOC4wOC4xOS4xOC4wNy43OS4xIDEuNTguMTUgMi4zNy4wMy4yNyAwIC44Mi4xMyAxLjA0LjEzLjI2LjQuNDMuNjguNDIuNDYgMCAuNzktLjQuNzctLjg3bC4wMy0uNTljLjA0LS43OS4wOC0xLjU4LjE1LTIuMzcuMDItLjI0LjQtLjIzLjQuMDFaIi8+PC9zdmc+)}.scylla-icon--about-us-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNi4zOCAzMi40MyI+PHBhdGggZD0iTTYuNTUgMzEuNjRjLS4yLjEzLS40My4yMi0uNjkuMjZhMS44MSAxLjgxIDAgMCAxLTIuMDYtMS4zOVMuNDkgMTQuOTkuNDkgMTEuODJDLjUgNS4xOSA1Ljc3LjUgMTMuMTkuNXMxMi42OSA0LjY5IDEyLjY5IDExLjMyYzAgMy4xOC0zLjMxIDE4LjY5LTMuMzEgMTguNjlhMS44MSAxLjgxIDAgMCAxLTIuNjIgMS4yIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0yMS44NiAyNS4zNmMtLjI4IDEuOS0uMzcgMy44Ni0uOTEgNS43MS0uNjEgMS40MS0yLjY4IDEuNzUtMy42Ni41NS0uNDEtLjQ3LjMxLTEuMTEuNzMtLjY2LjcxLjc2IDIuMDQuMjkgMi4xNi0uNzMuMzItMS42Ni42NS0zLjMzIDEuMDQtNC45OC4wOS0uMzkuNy0uMjguNjUuMTFaIi8+PHBhdGggZD0iTTE0LjggMTAuNTdjMCAzLjEzLTIuNTMgNS42Ni01LjY2IDUuNjZzLTUuNDctMi41My01LjQ3LTUuNjYgMi4zNC01LjY2IDUuNDctNS42NiA1LjY2IDIuNTMgNS42NiA1LjY2WiIgc3R5bGU9InN0cm9rZS13aWR0aDouOXB4O2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuMzEgNi44NmMtLjk4LjItMS4xNyAyLjM0LS41OSAyLjkzLjM4LjM4IDEuMTcuNTEgMS4xNy43OHMtLjc5LjQtMS4xNy43OGMtLjU5LjU5LS4zOSAyLjczLjU5IDIuOTMgMS4xNi4yMyAyLjkzLTEuMTcgMi45My0zLjcxcy0xLjc2LTMuOTQtMi45My0zLjcxWk02LjgyIDE4LjUxYzMuNDkuODkgNi45Ny0uNSA5LjUxLTIuOTMuNDctLjQ0IDEuMTYuMzEuNjguNzQtMS4zOCAxLjIzLTIuOTggMi4yOS00Ljc5IDIuODctMS44LjU5LTMuNzcuNTgtNS41OC4xNGEuNDIxLjQyMSAwIDAgMS0uMzEtLjVjLjA1LS4yMi4yOC0uMzYuNS0uMzFaIi8+PHBhdGggZD0iTTE2LjczIDE2LjY3Yy0uMTItLjQ2LS41MS0uODMtLjk5LS44My0uNzUtLjAyLS41OS0xLjE3LjE0LS45OS44MS4xNiAxLjQzLjg1IDEuNSAxLjY2LjA4LjQtLjU0LjU0LS42NS4xNVpNOS4wMyAzMS43Yy0xLjI2IDEuMzYtMy42Mi40NS0zLjgtMS4zNWwtLjA5LS41NWMtLjIxLTEuNDgtLjQ1LTIuOTUtLjYtNC40NC0uMDItLjE4LjExLS4zNC4yOS0uMzYuMTctLjAyLjMyLjA5LjM1LjI1LjM5IDEuNjMuNzEgMy4yOCAxLjAzIDQuOTMuMDkgMS4wMiAxLjM4IDEuNTQgMi4xMi44MS40NS0uNDQgMS4xNC4yNi42OS43WiIvPjxwYXRoIGQ9Ik0xMS45NiAzMS4xNmMtMSAxLjk4LTQuMDQgMS4zLTQuMjEtLjg4LS4xNS0xLjY5LS4zLTMuMzgtLjM5LTUuMDcgMC0uMTguMTMtLjM0LjMxLS4zNC4xNyAwIC4zMS4xMS4zNC4yNy4yOCAxLjY3LjUgMy4zNS43MiA1LjAzLjA5IDEuMiAxLjc3IDEuNTkgMi4zNi41MS4zMS0uNTYgMS4xNi0uMDkuODcuNDdaTTE5LjAzIDI1LjIxYy0uMDggMS42OS0uMjQgMy4zOC0uMzkgNS4wNy0uMDQuMzctLjE3Ljc1LS4zOCAxLjA2LS44NiAxLjQtMy4xMSAxLjMxLTMuODMtLjE3LS4zLS41Ni41NS0xLjAzLjg2LS40OC41OSAxLjA4IDIuMjcuNjkgMi4zNS0uNTIuMjItMS42OC40My0zLjM2LjcyLTUuMDMuMDYtLjQuNjgtLjMzLjY1LjA3WiIvPjxwYXRoIGQ9Ik0xNS40MyAyNS4wMmMuMDQgMS4zMS4wMiAyLjYxLjAyIDMuOTEtLjAzLjY3LjExIDEuNDgtLjIzIDIuMTMtLjc0IDEuNjktMy4yOSAxLjY5LTQuMDMgMC0uMzQtLjY1LS4yMS0xLjQ3LS4yNC0yLjEzIDAtMS4zLS4wMi0yLjYxLjAyLTMuOTEgMC0uMTguMTYtLjMyLjM0LS4zMi4xNyAwIC4zLjE0LjMyLjMuMTEgMS4zLjE3IDIuNi4yNCAzLjkxLjA1LjQ1IDAgMS4zNS4yMSAxLjcyLjIxLjQzLjY2LjcxIDEuMTIuNy40Ni4wMi45MS0uMjcgMS4xMi0uNjkuMjItLjM2LjE2LTEuMjguMjEtMS43Mi4wNy0xLjMuMTMtMi42MS4yNC0zLjkxLjAyLS40LjY2LS4zOC42Ni4wMloiLz48L3N2Zz4=)}.scylla-icon--alternator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMDAwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMTcuNSAyLjkxYzAgMS4yOC0zLjY3IDIuNTktOCAyLjU5cy04LTEuMzEtOC0yLjU5UzUuMDkuNSA5LjQyLjVzOC4wOCAxLjEzIDguMDggMi40MVpNMTcuNSA3LjY2YzAgMS4yOC0zLjYzIDIuOC03Ljk2IDIuOFMxLjUgOC45MyAxLjUgNy42Nk0xNy41IDEyLjQ3YzAgMS4yOC0zLjY3IDMuMDMtOCAzLjAzcy04LTEuNzUtOC0zLjAzTTE3LjUgMTcuMjljMCAxLjI4LTMuNzUgMi4zLTguMDggMi4zcy03LjkyLTEuMDMtNy45Mi0yLjNNMS41IDE3LjE5VjIuOTFNMTcuNSAxNy4xOVYyLjkxIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--apps{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTS41IDEuNWgyMHYxNEguNXpNNy41IDE1Ljc0djIuODlNMTIuODMgMTUuNjN2Mi4zMk01LjUgMTguNWg5LjE0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMy42NCA1LjU2IDQuNTggMi45MS00LjU4IDIuOTJNOS4xIDEyLjA4aDQuMzIiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--architecture{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy01e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTF7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMiwuY2xzLTV7c3Ryb2tlLW1pdGVybGltaXQ6MTB9LmNscy0ye3N0cm9rZS13aWR0aDouOThweH0uY2xzLTV7c3Ryb2tlLXdpZHRoOi45OXB4fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTEuOSAxMC4yN2ExMC44MyAxMC44MyAwIDAgMSA4LjczLTguMzhNMTAuNTEgMjMuMDhBMTAuNzkgMTAuNzkgMCAwIDEgMS43NyAxNE0yMy4yMyAxNGExMC44MSAxMC44MSAwIDAgMS05IDkuMTFNMTQuMjcgMS44OGExMC44MSAxMC44MSAwIDAgMSA4LjgzIDguMzciIGNsYXNzPSJjbHMtMSIvPjxjaXJjbGUgY3g9IjEyLjI1IiBjeT0iMS43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIyMi43NSIgcj0iMS43NSIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iNC45MiIgY3k9IjQuNzUiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PGNpcmNsZSBjeD0iMjAuMDkiIGN5PSIxOS45MSIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxLjc1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjIzLjI1IiBjeT0iMTIuMjUiIHI9IjEuNzUiIGNsYXNzPSJjbHMtNSIvPjxjaXJjbGUgY3g9IjQuNzUiIGN5PSIxOS42NCIgcj0iMS43NSIgc3R5bGU9InN0cm9rZS13aWR0aDouOTlweDtmaWxsOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlOmdyYXkiLz48Y2lyY2xlIGN4PSIxOS45MSIgY3k9IjQuNDgiIHI9IjEuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6Ljk5cHg7ZmlsbDpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--benchmarks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDozcHh9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV8yIiBkYXRhLW5hbWU9IkNhbHF1ZSAyIj48cGF0aCBkPSJNNS41MSAyNC45MXYtNS44NU0xMi41NyAyNC45MXYtOS43NE0xOS42MiAyNC45MVYxMC4xNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibS45MSAxNC45OCA1LjEzLTcuOTQgNi4yNSA1Ljg4TDI0IDEiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0ibTI1IDUtNS01aDV2NXoiIHN0eWxlPSJmaWxsOmdyYXkiLz48L2c+PC9zdmc+)}.scylla-icon--blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTkgMTUtMi41LTEuNSA4LTEyTDE3IDMgOSAxNXoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im02LjUgMTMuNS0uNSAzTDkgMTVsLTIuNS0xLjV6IiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik0xOS4yNSAyLjVoNC4yNXYxNmgtMTN2NC4xN0w2LjQ2IDE4LjVsLTQuOTYtLjA0VjIuNWg4LjMxTTE0LjUgMi41bDEuNjcgMS4zMyIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--careers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTEuNSAxMS41NXY4YzAgLjU2IDEuMDcgMiAyIDJoMThjLjg5IDAgMi0xLjQ0IDItMnYtOCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTIzLjMxIDMuNUgxLjgxYy0uNDggMC0xLjMxLjU1LTEuMzEgMXY2bDEwIDJhOC40NSA4LjQ1IDAgMCAwIDQgMGwxMC0ydi02YzAtLjQ1LS43Mi0xLTEuMTktMVpNMTUuNjIgMy41di0xYzAtLjc2LS42MS0xLTEuMzgtMWgtMy40NWMtLjc2IDAtMS4zOC4yNC0xLjM4IDF2MSIgY2xhc3M9ImNscy0xIi8+PHJlY3Qgd2lkdGg9IjUiIGhlaWdodD0iMy45OSIgeD0iMTAiIHk9IjExIiByeD0iLjU1IiByeT0iLjU1IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9zdmc+)}.scylla-icon--chevron-left{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTguMDkyIDE2IDEwIDE0LjExMyAzLjgxNyA4IDEwIDEuODg3IDguMDkyIDAgMCA4bDguMDkyIDhaIi8+PC9zdmc+)}.contents.local>ul>li a:before,.scylla-icon--chevron-right,.secondary-side-nav__content li a:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxNiIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTEuOTA4IDAgMCAxLjg4NyA2LjE4MyA4IDAgMTQuMTEzIDEuOTA4IDE2IDEwIDggMS45MDggMFoiLz48L3N2Zz4=)}.scylla-icon--circe{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzOCAzMCI+PGRlZnM+PHN0eWxlPi5jbHMtMiwuY2xzLTN7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTN7c3Ryb2tlLXdpZHRoOjEuMTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0yMi4xIDEyaC02LjE2YTEuMDYgMS4wNiAwIDAgMS0uOTQtMS4wNy45My45MyAwIDAgMSAuOTQtLjkzaDYuMTZhLjkzLjkzIDAgMCAxIC45NC45M0ExLjA2IDEuMDYgMCAwIDEgMjIuMSAxMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48cGF0aCBkPSJNMTMuNDQgNC40OUg5LjUxdjI0aDE5di0yNEgyNC41IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTMgMy40OUg4LjVsLS4wOCAyNi4xSDI5LjVWMy4zOUgyNSIgY2xhc3M9ImNscy0zIi8+PHBhdGggZD0iTTEyLjUgMTguMzhoMTNNMTIuNSAxNS40OWgxM00xMi41IDIxLjQzaDEzTTEyLjUgMjQuNDdoMTNNMTMuNSAyLjVoMTF2My45OGgtMTF6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMjEuNS41aC01LjA0djEuOTVsNS4wNC4wNXYtMnoiIGNsYXNzPSJjbHMtMyIvPjwvZz48L3N2Zz4=)}.scylla-icon--clock{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PGNpcmNsZSBjeD0iMTAuNSIgY3k9IjkuNSIgcj0iOSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEwLjUgMy41djZsMy4wNiAzIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--close{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzNCIgaGVpZ2h0PSIzNCIgZmlsbD0ibm9uZSI+PGcgZmlsbD0iI2ZmZiIgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBkPSJNMTEuNjcgMjIuMTNhLjU2NC41NjQgMCAwIDEtLjM5OC0uOTYybDkuODk2LTkuODk2YS41NjMuNTYzIDAgMSAxIC43OTcuNzk3bC05Ljg5NiA5Ljg5NmEuNTU5LjU1OSAwIDAgMS0uMzk5LjE2NVoiLz48cGF0aCBkPSJNMjEuNTY2IDIyLjEzYS41NTkuNTU5IDAgMCAxLS4zOTgtLjE2NWwtOS44OTYtOS44OTZhLjU2My41NjMgMCAxIDEgLjc5Ny0uNzk3bDkuODk2IDkuODk1YS41NjQuNTY0IDAgMCAxLS4zOTkuOTYzWiIvPjxwYXRoIGQ9Ik0xNi42MTkgMzMuMjM3QzcuNDU1IDMzLjIzNyAwIDI1Ljc4MiAwIDE2LjYxOSAwIDcuNDU2IDcuNDU1IDAgMTYuNjE5IDBzMTYuNjE5IDcuNDU1IDE2LjYxOSAxNi42MTktNy40NTYgMTYuNjE4LTE2LjYyIDE2LjYxOFptMC0zMi4xMWMtOC41NDIgMC0xNS40OTIgNi45NS0xNS40OTIgMTUuNDkyIDAgOC41NDIgNi45NSAxNS40OTIgMTUuNDkyIDE1LjQ5MiA4LjU0MiAwIDE1LjQ5Mi02Ljk1IDE1LjQ5Mi0xNS40OTIgMC04LjU0Mi02Ljk1LTE1LjQ5Mi0xNS40OTItMTUuNDkyWiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMzMuMjM3djMzLjIzN0gweiIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg==)}.scylla-icon--cloud{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8yIiB2aWV3Qm94PSIwIDAgNDMuMDQgMzIuMDMiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojMWQxZDFiO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iTGF5ZXJfMyI+PHBhdGggZD0iTTQyLjU0IDQuMDZjMCAxLjY4LTMuNjMgMi40NC05IDIuNDRzLTEwLS43My0xMC0yLjRTMjcuNjcuNSAzMy4wNC41czkuNSAxLjg5IDkuNSAzLjU2Wk00Mi41NCA5LjYzYzAgMS42OC0zLjc2IDIuOTEtOS4xMiAyLjkxcy05Ljg0LTEuMjMtOS44NC0yLjkxTTQyLjU0IDE1LjM0YzAgMS42OC0zLjY4IDMuMjUtOS4wNCAzLjI1LTQgMC03LjYtLjk2LTkuMDktMi4wNE00Mi41NCAyMC42NWMwIDEuNjgtMy43MiAyLjk3LTkuMDggMi45N00yMy41NCAxNS40NlY0LjFNNDIuNTQgMjAuNzdWNC4xIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMjguMTEgMjEuMDhjLS44NyAwLTEuNjcuMjMtMi4zOS42MSAwLS4wNy4wMS0uMTQuMDEtLjIxIDAtNC44NS0zLjgzLTguOS04LjY4LTguOXMtOC44OCA0LjA1LTguODggOC45YzAgLjE3LjAyLjM0LjAzLjUxLS44NC0uNTctMS44NS0uOTEtMi45NS0uOTEtMi44OCAwLTQuNzQgMi41Ny00Ljc0IDUuNDZzMS44NiA0Ljk5IDQuNzQgNC45OWgyMi44NmMyLjg4IDAgNS41Mi0yLjI3IDUuNTItNS4xNnMtMi42My01LjI5LTUuNTItNS4yOVoiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--cloud-docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSAxMS41aDh2MWgtOHpNMTUuNjUgNi41NWEzLjQyIDMuNDIgMCAwIDAtMy4xNSAyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTAuMDYgMi44QTUuMTcgNS4xNyAwIDAgMSAxNSA2LjM1aC4yNGE0Ljg0IDQuODQgMCAwIDEgMCA5LjY3aC0xMWEzLjQ1IDMuNDUgMCAwIDEgMC02LjlBMy4xNyAzLjE3IDAgMCAxIDUgOS4yIDUuMzMgNS4zMyAwIDAgMSA0Ljg2IDhhNS4yIDUuMiAwIDAgMSA1LjItNS4ybTAtLjhhNiA2IDAgMCAwLTYgNnYuMzFhNC4yNSA0LjI1IDAgMCAwIC4xOCA4LjQ5aDExYTUuNjMgNS42MyAwIDAgMCAuMy0xMS4yNkE2IDYgMCAwIDAgMTAuMDYgMloiIHN0eWxlPSJmaWxsOiM0ZDRkNGQiLz48L2c+PC9zdmc+)}.scylla-icon--comparison{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTIsLmNscy00e2ZpbGw6bm9uZTtzdHJva2U6Z3JheX0uY2xzLTEsLmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMiwuY2xzLTR7c3Ryb2tlLWxpbmVjYXA6cm91bmR9LmNscy00e3N0cm9rZS1saW5lam9pbjpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik00LjUgMTMuNjN2Mi44OGg2LjA2TTIwLjUgMTMuNTR2Mi45NmwtNS41LjAxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMTIuNSAxOC41djIuNzJNNy41IDIxLjVoMTAiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjEyLjUiIGN5PSIxNi41IiByPSIyIiBzdHlsZT0iZmlsbDpncmF5O3N0cm9rZS13aWR0aDouOTVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik01LjA2IDEzLjU4SDMuODhBMy4xIDMuMSAwIDAgMSAuNSAxMC41aDhhMy4xNiAzLjE2IDAgMCAxLTMuNDQgMy4wOFpNMjEgMTMuNThoLTEuMTdhMy4wOSAzLjA5IDAgMCAxLTMuMzctMy4wN2g4QTMuMTYgMy4xNiAwIDAgMSAyMSAxMy41OFpNNy40NiA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2UzEuNTggNS42IDEuNTggNSAzIDQuNCA0LjY5IDQuNHMyLjc3LjE2IDIuNzcuNzJaTTEuNSA5Ljg1VjUuMzFNNy41IDEwLjM1VjUuODFNMjMuNSA1LjEyYzAgLjU3LTEuMS40Ni0yLjc5LjQ2cy0zLjA5IDAtMy4wOS0uNTRTMTkgNC40IDIwLjczIDQuNHMyLjc3LjE2IDIuNzcuNzJaTTE3LjU0IDkuODVWNS4zMU0yMy41NCAxMC4zNVY1LjgxIiBjbGFzcz0iY2xzLTQiLz48L2c+PC9zdmc+)}.scylla-icon--contact-us{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjEuMDZweH08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJtNi4yOTggMTAuMTggMTMuODMtNy4xOTcgNC42NzYgOC45ODYtMTMuODMgNy4xOTd6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNi4zIDEwLjE4IDguNjMgMS41NmExLjQyIDEuNDIgMCAwIDAgMS41My0uNzRsMy42Ny04TTExLjAyIDE5LjAzbDEuNzQtNU0yNC41OSAxMS45N2wtNS4wOS0xLjQ1TTcuMDkgMTcuNTggMy45IDE5LjM0TTYuMDYgMTUuNDEuNTQgMTguMzYiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.scylla-icon--developers-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJtNi40OCAxMC41OS0uNS4xNy41LjE2TDExIDEyLjE2VjE0bC03LTIuNDlWMTBsNy0yLjV2MS44M1pNMTQgOS4zMlY3LjVsNyAyLjV2MS41NEwxNCAxNHYtMS44M2w0LjE0LTEuMy40NC0uMTMtLjQzLS4xNFoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xLjUgMi41aDIydjE2aC0xM3Y0LjE3TDYuNDYgMTguNWwtNC45Ni0uMDRWMi41eiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--docs{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMy41IDIuNTFoMTYuOTR2MjAuOTFIMy41eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIyLjQ1IDIxLjUuMDUtMjFoLTE3YTIuMTYgMi4xNiAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik02IDZoN3YySDZ6TTYgOWgxMXYySDZ6IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--enterprise{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJMYXllcl8zIiB2aWV3Qm94PSIwIDAgMjAgMjAiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ye2ZpbGw6bm9uZTtzdHJva2U6IzAwMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS13aWR0aDoxLjA3cHh9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTEzLjYyIDcuNSAxLjg4LTEuMDggMiAyLjA4djdoMU0xNS41IDE1LjV2LTUiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTUuNXYtMTJsNC0yIDQgMnYxMk05LjUgMTUuNVYxLjZNNy41IDUuNXYxME0xMS41IDUuNXYxMCIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuNSA4LjU0IDMuNDYgNy41bC0xLjk2Ljk2djcuMDRoLTFNMy41IDEwLjV2NU0uNSAxNy41aDE4IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--enterprise-m{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbDpzcGFjZT0icHJlc2VydmUiIGlkPSJMYXllcl8yXzAwMDAwMDE2NzY4MDY2MDE5MjYzMjMyNzcwMDAwMDA1NDc1ODA5NTExODI4NjY2MDM2XyIgeD0iMCIgeT0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDMgMzEiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDQzIDMxIj48c3R5bGU+LnN0MHtmaWxsOm5vbmU7c3Ryb2tlOiMxZDFkMWI7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PGcgaWQ9IkxheWVyXzMiPjxwYXRoIGQ9Im0yOS42IDkuNSA0LTIgNi45IDQuMXYxNS45aDJNMzMuNiAyNy41VjcuNk0xNC42IDI3LjVWNC44TDIyLjUuNSAyOS42IDV2MjIuNU0yMi41IDI3LjVWMU0yNC41IDUuNmwzIDJNMjQuNSA5LjZsMyAyTTI0LjUgMTMuNmwzIDJNMjQuNSAxNy41bDMgMk0yNC41IDIxLjVsMyAyTTM1LjQgMTEuNmwzIDJNMzUuNCAxNS42bDMgMS45TTM1LjQgMTkuNWwzIDJNMzUuNCAyMy41bDMgMS45TTE4LjUgNS44djIxLjdNMTQuNiA5LjdsLTQuMS0yLjUtOCA0LjR2MTUuOWgtMk0xMC41IDI3LjVWNy4yTTEyLjUgMTEuNmwyIDFNMTIuNSAxNS42bDIgLjlNMTIuNSAxOS41bDIgMU0xMi41IDIzLjVsMi4xIDFNNi40IDEyLjR2MTUuMU0uNSAzMC41aDQyIiBjbGFzcz0ic3QwIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--events{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye2ZpbGw6Z3JheX08L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNMjIuNSAyMy41aC0yMXYtMjBoMjJ2MTUuMjEiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjQyIDMuNWMwLTEuMzYgMS4wOS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xMC42NyAzLjVjMC0xLjM2IDEuMS0yIDIuNDYtMmEyLjQ2IDIuNDYgMCAwIDEgMCA0LjkxIDIuNjEgMi42MSAwIDAgMS0xLS4yMU0xNi45MyAzLjVjMC0xLjM2IDEuMS0yIDIuNDUtMmEyLjQ2IDIuNDYgMCAxIDEgMCA0LjkxIDIuNTIgMi41MiAwIDAgMS0xLS4yMSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTcgOWgzdjNIN3pNMTIgOWgzdjNoLTN6TTE3IDloM3YzaC0zek03IDE0aDN2M0g3ek0xMiAxNGgzdjNoLTN6TTE3IDE0aDN2M2gtM3oiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0zLjUgMy42N3YxNi42Nk0zLjUgMjAuNDNjMCAxLjI5LjQ0IDIuMzMgMS43MyAyLjMzczIuMzMtMS45IDIuMzMtMy4xOWwxNi45NC0uMDdjMCAxLjI5LS41NSAzLjEyLTEuODMgMy4xMkg2LjMiIGNsYXNzPSJjbHMtMSIvPjwvc3ZnPg==)}.admonition.note .admonition-title:before,.admonition.tip .admonition-title:before,.scylla-icon--exclamation{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyMiIgaGVpZ2h0PSIyMiIgeD0iMSIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDIzQzUuOSAyMyAxIDE4LjEgMSAxMlM1LjkgMSAxMiAxczExIDQuOSAxMSAxMS00LjkgMTEtMTEgMTFabTAtMjBjLTUgMC05IDQtOSA5czQgOSA5IDkgOS00IDktOS00LTktOS05WiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMiAxM2MtLjYgMC0xLS40LTEtMVY4YzAtLjYuNC0xIDEtMXMxIC40IDEgMXY0YzAgLjYtLjQgMS0xIDFaTTEyIDE3Yy0uMyAwLS41LS4xLS43LS4zLS4yLS4yLS4zLS40LS4zLS43IDAtLjEgMC0uMy4xLS40LjEtLjEuMS0uMi4yLS4zLjMtLjMuNy0uNCAxLjEtLjIuMSAwIC4xIDAgLjIuMSAwIDAgLjEuMS4yLjEuMS4xLjIuMi4yLjN2LjRjMCAuMSAwIC4zLS4xLjQtLjEuMS0uMS4yLS4yLjMtLjIuMi0uNC4zLS43LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.collapsible-button i,.scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNi4wMDEiIGhlaWdodD0iMTYiPjxwYXRoIGQ9Ik01IDEzYTEgMSAwIDAgMS0uNzEtLjI5bC00LTRhMSAxIDAgMCAxIDAtMS40MWw0LTRhMSAxIDAgMCAxIDEuNDIgMS40MUwyLjQxIDhsMy4yOSAzLjI5QTEgMSAwIDAgMSA1IDEzeiIvPjxwYXRoIGQ9Ik0xMSA5SDFhMSAxIDAgMCAxIDAtMmgxMGExIDEgMCAwIDEgMCAyek0xNSAxNmExIDEgMCAwIDEtMS0xVjFhMSAxIDAgMCAxIDIgMHYxNGExIDEgMCAwIDEtMSAxeiIvPjwvc3ZnPg==)}.scylla-icon--forum{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItdXNlcnMiPjxwYXRoIGQ9Ik0xNyAyMXYtMmE0IDQgMCAwIDAtNC00SDVhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjciIHI9IjQiLz48cGF0aCBkPSJNMjMgMjF2LTJhNCA0IDAgMCAwLTMtMy44N00xNiAzLjEzYTQgNCAwIDAgMSAwIDcuNzUiLz48L3N2Zz4=)}.scylla-icon--home{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0zLjUgNi4xNHYxMWExLjM4IDEuMzggMCAwIDAgMS4zNyAxLjM2aDExLjI2YTEuMzggMS4zOCAwIDAgMCAxLjM3LTEuMzd2LTExIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTkuNSA3LjUtOC02LjI1YTEuNTkgMS41OSAwIDAgMC0xLjk0IDBMMS41IDcuNU0xMi43MyAxOC4wMnYtNy4yMUg4LjI3djcuMjEiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--getting-started{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTcgNC41IDguNTEgNS4wNUw3IDE0LjV2LTEweiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjxyZWN0IHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgeD0iMS41IiB5PSIuNSIgcng9IjIuNDMiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--glossary{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIuNSAyLjVoMTN2MTZoLTEzeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjU4IDE3LjIxaDEuOTJWLjVoLTEzYTIuMzQgMi4zNCAwIDAgMC0yIDIiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik00LjggMTMuOTNhMSAxIDAgMCAwIC43NS0uNDMgNiA2IDAgMCAwIC41Mi0xLjA4bDIuODctNy4wN2guMzZsMi44OCA2Ljc5YTguOTIgOC45MiAwIDAgMCAuNzIgMS40Ny43Ni43NiAwIDAgMCAuNjguMzJ2LjMySDkuNHYtLjMyYTMuMjQgMy4yNCAwIDAgMCAuODMtLjExYy4xMy0uMDYuMi0uMTkuMi0uNDJhMS41OSAxLjU5IDAgMCAwLS4xLS40NmMwLS4xMi0uMS0uMjctLjE3LS40NGwtLjMzLS43OGgtMi45Yy0uMTkuNTEtLjMxLjg1LS4zNiAxYTIuMzggMi4zOCAwIDAgMC0uMTcuNzNjMCAuMTguMTIuMzIuMzcuNGEyLjU2IDIuNTYgMCAwIDAgLjY2LjA4di4zMkg0LjhabTQuODQtMi43Mi0xLjI0LTNoLS4xMWwtMS4xNiAzWiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvZz48L3N2Zz4=)}.scylla-icon--infoworld{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNMTIgMi41SDYuNVY2YzAgMyAuNTUgNy4xNyA1IDkuNXY0IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNi40IDQuNDRoLTRTMi41NiAxMSA4LjUgMTNNMTguNSA0LjVsNC0uMDZzLS4wNiA2LjU2LTYgOC41NiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEyIDIuNWg2LjVWNmMwIDIuOTQtLjQgNy4wOC01IDkuNXY0TTkuNSAxOS41aDZ2MmgtNnoiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik03LjUgMjEuNWgxMHYxaC0xMHoiIHN0eWxlPSJmaWxsOmdyYXk7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48L2c+PC9zdmc+)}.scylla-icon--integrations{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTE0LjU2IDEyLjctMS4yNS0xLjU3LTEuMzEuNzZhNiA2IDAgMCAwLTEuNjUtMWwuMDgtMS40OS0yLS40LS41MyAxLjQ0YTUuNzMgNS43MyAwIDAgMC0xLjg3LjMxbC0uODgtMS4xOS0xLjc3IDFMMy45MiAxMmE2LjMgNi4zIDAgMCAwLTEuMjIgMS40MWwtMS41LS4zNS0uNzQgMS44NyAxLjM4LjhhNi4yMyA2LjIzIDAgMCAwIDAgMS44M2wtMS40MS43Mi42NCAxLjkxIDEuNTktLjI4YTcuNjMgNy42MyAwIDAgMCAuNDguNjggNS44NiA1Ljg2IDAgMCAwIC42Ny43M2wtLjYyIDEuNDYgMS43MiAxIDEtMS4yNGE2LjQ2IDYuNDYgMCAwIDAgMS43OS4zNWwuNDYgMS41MiAyLS4zdi0xLjZhNi40MyA2LjQzIDAgMCAwIDEuNjItLjg5bDEuMy44NUwxNC40MyAyMWwtMS0xLjJhNi4yNCA2LjI0IDAgMCAwIC42OC0xLjc1bDEuNTEtLjE5LjA1LTItMS41MS0uMjZhNi4wNyA2LjA3IDAgMCAwLS42Mi0xLjgxWm0tNS4zNSA1LjUxYTEuOTMgMS45MyAwIDEgMSAuMzEtMi43MSAxLjkyIDEuOTIgMCAwIDEtLjMxIDIuNzFaIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMjQuMzEgOC4wNS0uMTMtMS42NS0xLjI1LS4wOWE1LjI2IDUuMjYgMCAwIDAtLjY3LTEuNDRsLjc1LTEtMS4xNi0xLjE3LTEgLjc0YTUuMTggNS4xOCAwIDAgMC0xLjQzLS42NmwtLjA2LTEuMjQtMS42NS0uMTctLjMyIDEuMjVhNS43NyA1Ljc3IDAgMCAwLTEuNTIuMzhMMTUgMi4xbC0xLjM3LjkuNTggMS4xOGE0Ljg4IDQuODggMCAwIDAtLjg2IDEuMjVsLTEuMy0uMTYtLjQ1IDEuNiAxLjIyLjU1YTUuMTcgNS4xNyAwIDAgMCAwIC42OEE0LjI4IDQuMjggMCAwIDAgMTMgOWwtMS4xMS43Mi42OSAxLjUxIDEuMjgtLjM3YTQuOTQgNC45NCAwIDAgMCAxLjA3IDEuMDdsLS4zOSAxLjI2IDEuNS43MS43NC0xLjA5YTUuMDcgNS4wNyAwIDAgMCAxLjUyLjE0bC41IDEuMTkgMS42MS0uNDEtLjEzLTEuMjlhNS4xNCA1LjE0IDAgMCAwIDEuMjctLjg4bDEuMTIuNTcgMS0xLjM1LS45MS0uODhhNC45IDQuOSAwIDAgMCAuNDItMS41MlptLTYuMiAxLjQzYTEuNzQgMS43NCAwIDEgMSAxLjYtMS44NiAxLjc0IDEuNzQgMCAwIDEtMS42IDEuODZaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--knowledge-base{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMSAxOSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9LmNscy0ye3N0cm9rZS1taXRlcmxpbWl0OjEwfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJMYXllcl81IiBkYXRhLW5hbWU9IkxheWVyIDUiPjxwYXRoIGQ9Ik0xNi4yMSA2LjM4YTUuMzYgNS4zNiAwIDAgMS0xLjUxIDMuNzMgNSA1IDAgMCAwLTEuNDUgMy4zMUg4LjQ3YTUuNDEgNS40MSAwIDAgMC0xLjI4LTMuMTEgNS4zNyA1LjM3IDAgMSAxIDktMy45M1pNMTMuMjMgMTUuNjdIOC40NSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTEzLjI0IDEzLjRoLTQuOHY0LjE2YS43LjcgMCAwIDAgLjcxLjdoMy4zOGEuNy43IDAgMCAwIC43MS0uN1oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik0xMC44NCA4LjIxYTEuNjUgMS42NSAwIDEgMSAxLjY0LTEuNjUgMS42NSAxLjY1IDAgMCAxLTEuNjQgMS42NVpNMTAuODQgOC42N3Y0LjY0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--less{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMyA4LjVhMSAxIDAgMCAxLTEgMUg1YTEgMSAwIDAgMSAwLTJoN2ExIDEgMCAwIDEgMSAxWiIvPjwvc3ZnPg==);filter:none}.scylla-icon--live-test{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtNntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTA7c3Ryb2tlLWxpbmVjYXA6cm91bmR9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTUiIHI9IjkuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTAgLjVoNXYyaC01eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjFweDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTUuOCA4LjIgNC4xMyA2LjUzbDEuOC0xLjgxTDcuNiA2LjQiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xMXB4O3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbGluZWNhcDpyb3VuZDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMTIgNlYyLjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6MS4xM3B4O3N0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0xMyA2VjIuNSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA4cHg7c3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTEyLjUgOC4wNlYxME0xMi41IDIwLjA0djEuODhNNy4xMyAxMC4wOGwxLjc5IDEuODhNMTYuMDQgMTcuMDhsMiAxLjg4TTcgMTguOTJsMS44OC0xLjg4TTE2LjEzIDExLjk2bDEuNzktMS44MyIgY2xhc3M9ImNscy02Ii8+PGVsbGlwc2UgY3g9IjEyLjUiIGN5PSIxNC4zNiIgcng9IjEuNSIgcnk9IjEuMzYiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJtMTIuNjMgMTQuNTQgMi41IDYuMzgiIGNsYXNzPSJjbHMtNiIvPjwvZz48L3N2Zz4=)}.scylla-icon--mail-list{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIxLjUiIGNsYXNzPSJmZWF0aGVyIGZlYXRoZXItbWFpbCI+PHBhdGggZD0iTTQgNGgxNmMxLjEgMCAyIC45IDIgMnYxMmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY2YzAtMS4xLjktMiAyLTJ6Ii8+PHBhdGggZD0ibTIyIDYtMTAgN0wyIDYiLz48L3N2Zz4=)}.scylla-icon--manager{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtM3tmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTdweH0uY2xzLTR7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxwYXRoIGlkPSJDYWxxdWVfMiIgZD0iTTE4IDJoNXYyMkgzVjJoNC45MiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik04IDBoMTB2NEg4eiIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjA3cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Ik03IDloM3YzSDd6TTcgMTZoM3YzSDd6IiBjbGFzcz0iY2xzLTMiLz48cGF0aCBkPSJNMTIuNSA5LjVoN3YyaC03ek0xMi41IDE2LjVoN3YyaC03eiIgY2xhc3M9ImNscy00Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--memory-management{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZH0uY2xzLTJ7c3Ryb2tlLXdpZHRoOjEuMTNweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxyZWN0IHdpZHRoPSIxNSIgaGVpZ2h0PSIxNSIgeD0iNS41IiB5PSI1LjUiIGNsYXNzPSJjbHMtMSIgcng9IjIuNzQiIHJ5PSIyLjc0Ii8+PHBhdGggZD0iTTkuNSA5LjVoN3Y3aC03eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTguNSA1LjV2LTRNMTEuNSA1LjV2LTRNMTQuNSA1LjV2LTRNMTcuNSA1LjV2LTRNOC41IDI0LjV2LTRNMTEuNSAyNC41di00TTE0LjUgMjQuNXYtNE0xNy41IDI0LjV2LTRNMjAuNSA4LjVoNE0yMC41IDExLjVoNE0yMC41IDE0LjVoNE0yMC41IDE3LjVoNE0xLjUgOC41aDRNMS41IDExLjVoNE0xLjUgMTQuNWg0TTEuNSAxNy41aDQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--monitoring{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTUuNTUgMTAuODlhMy44MyAzLjgzIDAgMCAxLS4xNS0zLjc2IiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxyZWN0IHdpZHRoPSIzLjA1IiBoZWlnaHQ9IjEwLjgiIHg9IjE3LjYzIiB5PSIxNC4wMSIgcng9Ii41NyIgcnk9Ii41NyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6Z3JheTtzdHJva2Utd2lkdGg6Ljk1cHg7c3Ryb2tlOmdyYXkiIHRyYW5zZm9ybT0icm90YXRlKC00NSAxOS4xNTggMTkuNDA1KSIvPjxjaXJjbGUgY3g9IjguNSIgY3k9IjkiIHI9IjciIHN0eWxlPSJzdHJva2Utd2lkdGg6MnB4O3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZTpncmF5O2ZpbGw6bm9uZSIvPjxwYXRoIGQ9Im0xNi4wNSAxNi4zOS0yLjI4LTIuMjgiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2U6Z3JheTtmaWxsOm5vbmUiLz48L2c+PC9zdmc+)}.scylla-icon--networking{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTB9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iNCIgc3R5bGU9InN0cm9rZS13aWR0aDouOTRweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48Y2lyY2xlIGN4PSI1IiBjeT0iMyIgcj0iMi41IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxOSIgY3k9IjIwIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjIyIiBjeT0iNi42IiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjIyIiByPSIyLjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Im02LjgzIDUuNSAzLjI1IDQuMzNNMjAuMjMgNy44NSAxNS4zMyAxMU05LjgzIDE1LjA4bC00LjA5IDUuODRNMTQuNTggMTUuMzNsMyAzLjA5IiBjbGFzcz0iY2xzLTIiLz48Y2lyY2xlIGN4PSIxMi41IiBjeT0iMTIuNSIgcj0iMS41IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--news{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTMgMTUuMTcgMTYuMzEgMy44MmExLjQ4IDEuNDggMCAwIDEgMi4yMi40Nmw1LjE1IDkuNjVhMS40NiAxLjQ2IDAgMCAxLS45MyAyLjEyTDUuNjkgMTkuOVpNOC43MSAxOS4zM2wuNzYgMi4yMmExLjUxIDEuNTEgMCAwIDAgMS44NSAxbDMuNTgtMS4wNmExLjUgMS41IDAgMCAwIDEtMS44NkwxNS40NSAxOE01LjU0IDIwbC0xLjgzIDFhLjkyLjkyIDAgMCAxLTEuMjUtLjM3TC42MSAxNy40OUEuOTIuOTIgMCAwIDEgMSAxNi4yNGwxLjgzLTFNOC41IDE0bDcuMzgtNS41IiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--newsletter{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1taXRlcmxpbWl0OjEwfS5jbHMtMntzdHJva2UtbGluZWNhcDpyb3VuZH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzQiIGRhdGEtbmFtZT0iQ2FscXVlIDQiPjxwYXRoIGQ9Ik0xOS41IDkuNWgzdjEyaC0yMHYtMTJoMyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTIuNjUgOS44NCA5Ljg1IDYuODggOC42My02Ljg4IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtNS41IDcuNS0zIDJNMTQuMzUgMy44NmwtMS40Ni0xLjA5LTEuNDcgMS4wOU0yMS41IDkuNWwtMi0yTTE5LjUgMTEuNXYtN2gtMTR2Ny40NyIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--nsql-guides{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGcgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHJlY3Qgd2lkdGg9IjEuMTUiIGhlaWdodD0iOS43MiIgeD0iNC4zNyIgeT0iMTMuNzEiIHJ4PSIuNTQiIHJ5PSIuNTQiIHN0eWxlPSJzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOmdyYXk7c3Ryb2tlLXdpZHRoOjEuMDlweCIgdHJhbnNmb3JtPSJyb3RhdGUoNDUgNC45NDggMTguNTcpIi8+PGNpcmNsZSBjeD0iMTIuMjUiIGN5PSIxMi4yNSIgcj0iNC43NSIgc3R5bGU9InN0cm9rZS13aWR0aDoxLjVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNOC41IDIwLjV2M2gxNXYtMjFoLTE1djIiIHN0eWxlPSJzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2Utd2lkdGg6MS4wNnB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbWl0ZXJsaW1pdDoxMCIvPjwvZz48L3N2Zz4=)}.scylla-icon--open-source{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNLjMxIDIxLjUxIDUgMTkuNjlhMi4zNyAyLjM3IDAgMCAxIDEuODguMTlsNS4yNCAxLjY4YTIuMjMgMi4yMyAwIDAgMCAyLS4xMmw5LjUtNC43NWMuOC0uNDQgMS42NC0xLjMxIDEuMTMtMS45MWEyLjM0IDIuMzQgMCAwIDAtMi42NC0uNDJMMTggMTYuMDkiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Im0uMjUgMTUuNjkgNC44OC0xLjIxYzEuMjUtLjMgMi4xNy0uNjMgMy40NC0uMTNhMTUuMjEgMTUuMjEgMCAwIDAgNCAxLjFoNC41MmMuODUgMCAuOTUuNTQuOTUgMS4xM2ExIDEgMCAwIDEtMS4wOCAxIDY1Ljg2IDY1Ljg2IDAgMCAxLTctLjMxIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOC41NiA5LjY4di0uODFjMC0uOTEtLjM4LTEuMjEtMS4yOS0xLjIxSDdWNi4zaC4zMWMuOTEgMCAxLjI5LS4zIDEuMjktMS4yMXYtLjgxYzAtMS4yLjY2LTEuOTIgMi44Mi0yLjN2MS4xNmMtMS4yNC4zNS0xLjQzLjY4LTEuNDMgMS40di44N0ExLjUyIDEuNTIgMCAwIDEgOC43NSA3IDEuNTIgMS41MiAwIDAgMSAxMCA4LjU2di44N2MwIC43MS4xOSAxIDEuNDMgMS40VjEyYy0yLjIxLS4zNS0yLjg3LTEuMTItMi44Ny0yLjMyWk0xNy40MyA0LjN2LjgxYzAgLjkxLjM3IDEuMjEgMS4yOSAxLjIxSDE5djEuMzZoLS4zMWMtLjkyIDAtMS4yOS4zLTEuMjkgMS4yMXYuODFjMCAxLjItLjY1IDItMi44MSAyLjM1di0xLjJjMS4yNS0uMzYgMS40NC0uNjkgMS40NC0xLjR2LS44N0ExLjUzIDEuNTMgMCAwIDEgMTcuMjUgNyAxLjUzIDEuNTMgMCAwIDEgMTYgNS40M3YtLjg3YzAtLjcyLS4xOS0xLTEuNDQtMS40VjJjMi4yMi4zOCAyLjg3IDEuMSAyLjg3IDIuM1oiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--operator{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjQuODEgMS4wMSAyOC4zMiAyNy42NCI+PHBhdGggZD0iTTMyLjUyIDE4cy0uMDkgMC0uMDktLjA1LS4wOCAwLS4xNyAwYTIuMTkgMi4xOSAwIDAgMC0uNTEgMCAuNDcuNDcgMCAwIDEtLjI2LS4wNSA5LjI5IDkuMjkgMCAwIDEtMS40OS0uMzIuNTQuNTQgMCAwIDEtLjMtLjMxbC0uMzQtLjA4YTExLjI1IDExLjI1IDAgMCAwLS4xOC0zLjc5IDExLjU1IDExLjU1IDAgMCAwLTEuNS0zLjUybC4yNi0uMjZhLjU5LjU5IDAgMCAxIC4xMy0uMzkgNy43MyA3LjczIDAgMCAxIDEuMi0uODZsLjI2LS4xMy40Ny0uM3MuMDkgMCAuMTMtLjA4IDAtLjA1IDAtLjA5YS44NC44NCAwIDAgMCAuMTctMS4yLjc4Ljc4IDAgMCAwLS42LS4zIDEgMSAwIDAgMC0uNi4yMWMtLjA1LjA1LS4wOS4wOS0uMTMuMDlhMy4wOCAzLjA4IDAgMCAwLS4zNS4zOWMwIC4wOC0uMTMuMTMtLjE3LjE3YTUuNjQgNS42NCAwIDAgMS0xLjA3Ljk0LjU4LjU4IDAgMCAxLS4yNi4wOS4yNS4yNSAwIDAgMS0uMTcgMGgtLjA1bC0uMzQuMjEtMS4wOC0xYTExIDExIDAgMCAwLTUuNjUtMi4yN3YtLjM0YS42LjYgMCAwIDEtLjIyLS4zNEE4LjE4IDguMTggMCAwIDEgMTkuNjYgM3YtLjI1YzAtLjA4LjA1LS4zNS4wOS0uNTJ2LS4zMWEuODIuODIgMCAwIDAtMS40Ni0uNi44Ni44NiAwIDAgMC0uMjYuNnYuMjJhMS44MiAxLjgyIDAgMCAwIC4wOS41MS41OS41OSAwIDAgMSAwIC4yNlYzYTguODIgOC44MiAwIDAgMSAuMDggMS40Ny41OS41OSAwIDAgMS0uMjEuMzRWNS4yNGMtLjQ4IDAtMSAuMTMtMS40Ny4yMmExMC4xNiAxMC4xNiAwIDAgMC01LjI4IDNMMTEgOC4yNGgtLjE3YS43My43MyAwIDAgMS0uMjYtLjA5IDcuOCA3LjggMCAwIDEtMS4wNy0xYzAtLjA4LS4xMy0uMTMtLjE3LS4xN3MtLjI1LS4yLS4zMy0uMzMtLjA4IDAtLjEzLS4wOHYtLjA1YTEgMSAwIDAgMC0uNi0uMjEuNjQuNjQgMCAwIDAtLjYuMy45MS45MSAwIDAgMCAuMTcgMS4yczAgLjA1IDAgLjA1LjA5LjA4LjEzLjA4YTUgNSAwIDAgMCAuNDcuMjZsLjI2LjEzYTYuNjEgNi42MSAwIDAgMSAxLjIxLjg2LjQ3LjQ3IDAgMCAxIC4xMy4zOXYtLjA1bC4yNS4yNmEyLjUzIDIuNTMgMCAwIDEtLjEzLjIyIDEwLjIgMTAuMiAwIDAgMC0xLjUgN2wtLjM1LjA5YzAgLjEzLS4xNy4yMS0uMy4zYTguNTYgOC41NiAwIDAgMS0xLjQ2LjI2LjU5LjU5IDAgMCAwLS4yNiAwaC0uNTJjLS4xOCAwLS4wOC4wNS0uMTcuMDVoLS4wOGEuODQuODQgMCAwIDAtLjY5IDEgLjc5Ljc5IDAgMCAwIC44Ni42LjM5LjM5IDAgMCAwIC4yMSAwSDYuMTJhMy42MSAzLjYxIDAgMCAwIC40Ny0uMTcuNjUuNjUgMCAwIDEgLjI2LS4wOCA3LjY1IDcuNjUgMCAwIDEgMS40Mi0uMzkuNDkuNDkgMCAwIDEgLjM1LjEzaC4zOWExMC4zMiAxMC4zMiAwIDAgMCAzLjUzIDUgNi4zMSA2LjMxIDAgMCAwIDEuMTYuNzdsLS4yMi4zYS41MS41MSAwIDAgMSAwIC40MyA2LjU0IDYuNTQgMCAwIDEtLjY5IDEuMjR2LjA1YS43OC43OCAwIDAgMS0uMTcuMjFjLS4wOS4wOS0uMTcuMjYtLjMuNDNzMCAuMDktLjA5LjEzIDAgLjA1IDAgLjA1YS44OC44OCAwIDAgMCAuMzQgMS4xNi45LjkgMCAwIDAgLjMuMDggMSAxIDAgMCAwIC44Mi0uNTFzMC0uMDguMDktLjEzLjEzLS4zLjE3LS40N2wuMDktLjI2YTcuMDcgNy4wNyAwIDAgMSAuNTYtMS4zMy42Mi42MiAwIDAgMSAuMzQtLjI2bC4xNy0uMzVhMTAuMDUgMTAuMDUgMCAwIDAgMy43NS42OSA4LjQ1IDguNDUgMCAwIDAgMi4zMi0uMyAxMS40NiAxMS40NiAwIDAgMCAxLjM3LS4zOWwuMTguMzFhLjYyLjYyIDAgMCAxIC4zNC4yNiA3LjA3IDcuMDcgMCAwIDEgLjU2IDEuMzNsLjA5LjI2YTEuMzEgMS4zMSAwIDAgMCAuMTcuNDdjMCAuMDUgMCAuMDkuMDkuMTNhMSAxIDAgMCAwIC44Mi41MSAxLjA1IDEuMDUgMCAwIDAgLjM0LS4wOC43Ni43NiAwIDAgMCAuMzktLjQ4IDEuMDggMS4wOCAwIDAgMC0uMDUtLjY0LjIuMiAwIDAgMC0uMDgtLjEzIDEuNTMgMS41MyAwIDAgMC0uMzEtLjQzLjY1LjY1IDAgMCAwLS4xNy0uMjJ2LS4wOWE1LjIyIDUuMjIgMCAwIDEtLjY5LTEuMjQuNTEuNTEgMCAwIDEgLjA1LS40M2wtLjEzLS4zNEExMC42OCAxMC42OCAwIDAgMCAyOSAxOC44MmwuMzQuMDV2LS4wNWEuNTQuNTQgMCAwIDEgLjM1LS4xMyA3LjgyIDcuODIgMCAwIDEgMS4zOC4zOS42Mi42MiAwIDAgMCAuMjYuMDkgMi40MiAyLjQyIDAgMCAwIC40Ny4yMXMuMDkgMCAuMTcgMGguMDlhLjM5LjM5IDAgMCAwIC4yMSAwIC45NC45NCAwIDAgMCAuODYtLjYgMSAxIDAgMCAwLS43Ny0uOVptLTEyLjQzLTEuMzMtMS4xNi41Ni0xLjE2LS41Ni0uMy0xLjI1LjgxLTFoMS4yOWwuODIgMVptNy0yLjc5YTggOCAwIDAgMSAuMTcgMi43MWwtNC4xNS0uNzVjLS4zOC0uMDgtLjY4LS45LS43MS0xLjIyYTQgNCAwIDAgMSAuMjEtLjc0bDMuNDUtMi41NGE4LjU4IDguNTggMCAwIDEgMS4wNCAyLjU0Wm0tMi4zMS00LjEzLTMuMjIgMi42OWExLjI4IDEuMjggMCAwIDEtMS4yNS0uMzdjLS4wOS0uMDktLjM3LS4yNS0uMzctLjM4VjcuNDNhOC4wNyA4LjA3IDAgMCAxIDQuODYgMi4zMlpNMTcgNy41NmwxLS4xOC0uMDYgNC4zMWMwIC4zOC0uNjQuNjgtMSAuNjhhMS4xMSAxLjExIDAgMCAxLS4zNS0uMDhMMTMgOS43NWE4LjQxIDguNDEgMCAwIDEgNC0yLjE5Wm0tNS4yNCAzLjc4IDMuMzcgMi40Ny4zMi41M2ExLjE0IDEuMTQgMCAwIDEtLjI1IDEgLjc4Ljc4IDAgMCAxLS4zOC4zMWwtNC4zMS45YTkgOSAwIDAgMSAxLjI0LTUuMjFaTTExIDE4LjYxbDQuMS0xLjIzYy4zNSAwIC44NC43MS44OSAxLjA2YS41MS41MSAwIDAgMS0uMDUuNDNsLTEuNjMgMy45NUE4LjQxIDguNDEgMCAwIDEgMTEgMTguNjFabTkuNzYgNS4zM2E4LjY3IDguNjcgMCAwIDEtMS44NS4yMSA5LjU5IDkuNTkgMCAwIDEtMi43MS0uNDNsMS42Ni00Yy4yMS0uMjYgMS0uMiAxLjMxIDBhMi40OCAyLjQ4IDAgMCAxIC4zNC4zbDIuMDcgMy43NGE1LjcyIDUuNzIgMCAwIDAtLjguMThaTTI2IDIwLjJhOC4zNiA4LjM2IDAgMCAxLTIuNTggMi41OGwtMS45Mi0zLjcyYTEuMTUgMS4xNSAwIDAgMSAuNDEtMWMuMjEtLjI1LjU5LS41OS43MS0uNTlsNC4yMiAxLjA2QTYuMjcgNi4yNyAwIDAgMSAyNiAyMC4yWiIgZGF0YS1uYW1lPSJDYWxxdWUgMiIgc3R5bGU9ImZpbGw6IzRkNGQ0ZCIvPjwvc3ZnPg==)}.scylla-icon--overview{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIyLjYxIDMuNDVDMjIuNjEgNS4wNiAxOCA2LjUgMTIuNSA2LjVzLTEwLTEuNDQtMTAtMyA0LjUtMyAxMC0zIDEwLjExIDEuMzMgMTAuMTEgMi45NVpNMjIuNjEgOS40NGMwIDEuNjEtNC42NCAzLjA2LTEwLjExIDMuMDZzLTEwLTEuNDUtMTAtMy4wNk0yMi42MSAxNS41MWMwIDEuNjItNC42NCAzLTEwLjExIDNzLTEwLTEuMzctMTAtM00yMi42MSAyMS41OWMwIDEuNjItNC42NCAyLjkxLTEwLjExIDIuOTFzLTEwLTEuMjktMTAtMi45MU0yLjUgMjEuNDdWMy40NU0yMi41IDIxLjQ3VjMuNDUiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--partners{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0iTTE4LjUgOC4yNmgtNC43MmwtMS4yMyAxLjI3TTIuMzkgMTUuMDkuMTUgMTMuNzRsNC44Ny04LjQyIDIuMjQgMS4zNC00Ljg3IDguNDN6TTIyLjU5IDE1LjA5bDIuMjQtMS4zNS00Ljg2LTguNDItMi4yNCAxLjM0IDQuODYgOC40M3pNMTAuNzEgMTUuMjZsLTIuOTMgMi4yMU0xMi4xOCAxNi40bC0yLjkzIDIuMjFNMTMuNjggMTcuNTNsLTIuOTMgMi4yMiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTYuMzggOC4zaDMuNzhhMi4yNyAyLjI3IDAgMCAxIDEuMzcuNDdjMS4yNiAxIDQuMDkgMy4xOCA0LjQ4IDMuNTZzLTEuMTQgMS42OC0yLjI3IDEuMWExOC4zNCAxOC4zNCAwIDAgMC0yLjExLS45Mi41Ny41NyAwIDAgMC0uNTYuMDlsLTQuNzkgMy44OUwxMi4zMyAyMWw5LjQ2LTcuMDlNMy4yNCAxNC4yMmwzLjQgMS44NSIgY2xhc3M9ImNscy0xIi8+PC9zdmc+)}.scylla-icon--plus{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHJlY3Qgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBmaWxsPSIjQjNCQUM1IiByeD0iMSIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNSA1YTEgMSAwIDEgMC0yIDB2Mi41SDVhMSAxIDAgMSAwIDAgMmgyLjVWMTJhMSAxIDAgMSAwIDIgMFY5LjVIMTJhMSAxIDAgMSAwIDAtMkg5LjVWNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==);filter:none}.scylla-icon--pricing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0ibTIxLjczIDctMi40MS01LjEyYTIuNTIgMi41MiAwIDAgMC0yLjgyLTFsLTYuMDggMi4wNEExLjY5IDEuNjkgMCAwIDAgOS41MSA0TDMuOTMgMTkuMjlhMS4wNiAxLjA2IDAgMCAwIC42NCAxLjE3bDEwLjM0IDMuNzZhMSAxIDAgMCAwIDEuMjItLjQzbDUuNTgtMTUuMzNBMS44NyAxLjg3IDAgMCAwIDIxLjczIDdaIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIxNS43MyIgY3k9IjUuODkiIHI9IjIiIGNsYXNzPSJjbHMtMSIvPjx0ZXh0IHN0eWxlPSJmb250LXNpemU6MTJweDtmaWxsOmdyYXk7Zm9udC1mYW1pbHk6Um9ib3RvLU1lZGl1bSxSb2JvdG8iIHRyYW5zZm9ybT0icm90YXRlKDIwIC00OC4yNDQgMzAuNjcpIj4kPC90ZXh0PjwvZz48L3N2Zz4=)}.scylla-icon--release-note{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS13aWR0aDouOTFweH08L3N0eWxlPjwvZGVmcz48ZyBpZD0iQ2FscXVlXzIiIGRhdGEtbmFtZT0iQ2FscXVlIDIiPjxwYXRoIGQ9Ik0yMS41IDI0LjVoLTE3VjUuN0w4Ljk1LjU0IDIxLjUuNXYyNHoiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjlweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTQuNjUgNS41SDkuNVYxTTcuNSA4LjVoMTFNNy41IDExLjVoMTFNNy41IDE0LjVoMTFNNy41IDE3LjVoMTFNNy41IDIwLjVoMTEiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.scylla-icon--resource-center{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfS5jbHMtMntmaWxsOmdyYXl9PC9zdHlsZT48L2RlZnM+PGcgaWQ9IkNhbHF1ZV80IiBkYXRhLW5hbWU9IkNhbHF1ZSA0Ij48cGF0aCBkPSJNNS41IDIuNWg2LjkxbC4wOSAyMGgtN3YtMjB6IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNOCA0aDJ2MTAuOTdMOCAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMzYgMi4yOSAyLjUgMy41djE4bDIuNzkgMS4xNCIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTEyLjU3IDIxLjg2IDEuNTcuNzUiIHN0eWxlPSJzdHJva2Utd2lkdGg6LjY4cHg7ZmlsbDpub25lO3N0cm9rZTpncmF5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZCIvPjxwYXRoIGQ9Im0xNC4xMSAyLjUtMS41NC41NyIgc3R5bGU9InN0cm9rZS13aWR0aDouODVweDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PGNpcmNsZSBjeD0iOSIgY3k9IjE5IiByPSIxIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuNSAyLjVoNi45NGwuMDYgMjBoLTd2LTIweiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE3IDRoMnYxMC45N0wxNyAxNVY0eiIgY2xhc3M9ImNscy0yIi8+PGNpcmNsZSBjeD0iMTgiIGN5PSIxOSIgcj0iMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTEyLjYgMi43M2gxLjY3VjIyLjZIMTIuNnpNMi41OCAyMS41bDIuNzUgMS4xVjIuNzNsLTIuNjYuOTQtLjA5IDE3LjgzeiIgY2xhc3M9ImNscy0yIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--roadmap{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTpncmF5fS5jbHMtMXtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOi45OHB4fS5jbHMtMntzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTN7ZmlsbDpncmF5fTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibS41IDQuNSA4LTMgOCA0IDgtM3YxN2wtOCAzLTgtNC04IDN2LTE3ek04LjUgMS41VjE4TTE2LjUgNS41VjIyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNMi41IDEzIDcgMTYuNU03IDEybC00LjUgNS41TTE4LjUgOGw0LjUgMy41TTIzIDdsLTQuNSA1LjUiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik0xMCAxM2gxdjFoLTF6TTEyIDEyaDF2MWgtMXpNMTQgMTFoMXYxaC0xeiIgY2xhc3M9ImNscy0zIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--search{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=)}.scylla-icon--slack{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tISBGb250IEF3ZXNvbWUgUHJvIDYuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIChDb21tZXJjaWFsIExpY2Vuc2UpIENvcHlyaWdodCAyMDIyIEZvbnRpY29ucywgSW5jLi0tPjxwYXRoIGQ9Ik05NC4xMiAzMTUuMWMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZTMCAzNDEgMCAzMTUuMWMwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoNDcuMDZ2NDcuMDZ6bTIzLjcyIDBjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2czQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2djExNy44NGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZzLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2VjMxNS4xem00Ny4wNi0xODguOThjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNlMxMzkgMzIgMTY0LjkgMzJzNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZ2NDcuMDZIMTY0Ljl6bTAgMjMuNzJjMjUuOSAwIDQ3LjA2IDIxLjE2IDQ3LjA2IDQ3LjA2cy0yMS4xNiA0Ny4wNi00Ny4wNiA0Ny4wNkg0Ny4wNkMyMS4xNiAyNDMuOTYgMCAyMjIuOCAwIDE5Ni45czIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2SDE2NC45em0xODguOTggNDcuMDZjMC0yNS45IDIxLjE2LTQ3LjA2IDQ3LjA2LTQ3LjA2IDI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNnMtMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZoLTQ3LjA2VjE5Ni45em0tMjMuNzIgMGMwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDYtMjUuOSAwLTQ3LjA2LTIxLjE2LTQ3LjA2LTQ3LjA2Vjc5LjA2YzAtMjUuOSAyMS4xNi00Ny4wNiA0Ny4wNi00Ny4wNiAyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDZWMTk2Ljl6TTI4My4xIDM4NS44OGMyNS45IDAgNDcuMDYgMjEuMTYgNDcuMDYgNDcuMDYgMCAyNS45LTIxLjE2IDQ3LjA2LTQ3LjA2IDQ3LjA2LTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNnYtNDcuMDZoNDcuMDZ6bTAtMjMuNzJjLTI1LjkgMC00Ny4wNi0yMS4xNi00Ny4wNi00Ny4wNiAwLTI1LjkgMjEuMTYtNDcuMDYgNDcuMDYtNDcuMDZoMTE3Ljg0YzI1LjkgMCA0Ny4wNiAyMS4xNiA0Ny4wNiA0Ny4wNiAwIDI1LjktMjEuMTYgNDcuMDYtNDcuMDYgNDcuMDZIMjgzLjF6Ii8+PC9zdmc+)}.scylla-icon--stack-overflow{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIzMSIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJtMjEuOTQ5LjExMyAyLjA0MyAxMS42Ny0yLjUxNC40MzJMMTkuNDM1LjU0NSAyMS45NS4xMTRabS0xNy45NzMgMjYgMTEuOTQ1LS4wMDUtLjAwMi0yLjUzLTExLjk0NC4wMDYuMDAxIDIuNTNabTEyLjIzMi01Ljc3N0w0LjMxNSAxOS4yNWwtLjIzNSAyLjUyIDExLjg5NCAxLjA4NS4yMzQtMi41MTlabS0xMC43NS02LjM3NSAxMS41MzUgMy4wNzQtLjY2MiAyLjQ0My0xMS41MzUtMy4wNzUuNjYyLTIuNDQyWm0xMy4wNC4xOEw4LjIxMiA4LjEyNmwtMS4yOTcgMi4xNzggMTAuMjg5IDYuMDE3IDEuMjk2LTIuMTc4Wm0tNC4yMDYtMTEuNTYgNi43MyA5Ljc4Ny0yLjEwOCAxLjQyNC02LjczLTkuNzg1IDIuMTA4LTEuNDI1WiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTE3Ljk1IDE3Ljc4OVYyOC4xM0gyLjI4MlYxNy43ODlILjI0M3YxMi4zMjZIMTkuOThWMTcuNzg5aC0yLjAzWiIvPjwvc3ZnPg==)}.scylla-icon--summit{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGlkPSJDYWxxdWVfMSIgZGF0YS1uYW1lPSJDYWxxdWUgMSIgdmlld0JveD0iMCAwIDI1IDI1Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6bm9uZTtzdHJva2U6IzRkNGQ0ZDtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmR9PC9zdHlsZT48L2RlZnM+PHBhdGggZD0ibTE2LjUgMjIgMS02LjUtMTAgLjAzIDEgNi40MyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTMuNDYgMTJBNS42OSA1LjY5IDAgMCAxIDUgNy41IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOjEuMXB4O3N0cm9rZTojNGQ0ZDRkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtmaWxsOm5vbmUiLz48cGF0aCBkPSJNMTQuNjIgNWEyLjMzIDIuMzMgMCAwIDEtMi4yNSAyLjVjLTEuMzMgMC0yLTEuMTItMS45NS0yLjQ0cy43LTIuNSAyLTIuNDhBMi4yNyAyLjI3IDAgMCAxIDE0LjYyIDVaTTE3LjU4IDEyYTMuMjMgMy4yMyAwIDAgMC0zLjQ2LTMuNUgxMUEzLjI2IDMuMjYgMCAwIDAgNy41IDEyIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0Ljk0IiBjeT0iNi45NiIgcj0iMS4wMSIgc3R5bGU9ImZpbGw6IzRkNGQ0ZDtzdHJva2Utd2lkdGg6MS4xcHg7c3Ryb2tlOiM0ZDRkNGQ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIi8+PHBhdGggZD0iTTcuNTQgMTguNUg0LjVsLTItNmgyMGwtMiA2aC0zIiBjbGFzcz0iY2xzLTEiLz48L3N2Zz4=)}.scylla-icon--support{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTE4LjE5IDcuNWExMCAxMCAwIDAgMSAuMjEgMi4wN2MwIDQuMzYtMi42MyA2LjkzLTUuOSA2Ljkzcy01Ljk0LTIuNTctNS45NC02LjkzYTEwLjUxIDEwLjUxIDAgMCAxIC4yMi0yLjEyIiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJNNy42NyAyLjIzQTYuNTggNi41OCAwIDAgMSAxMi41LjVhNS42NSA1LjY1IDAgMCAxIDQuMjkgMS43YzEuOTMgMS45NCAyLjM1IDUuMDcgMi40MyA2LjcyYTEuNDkgMS40OSAwIDAgMC0uNzkuMDUgOC42OCA4LjY4IDAgMCAwLS4wOC0xLjE2aDBhNS41MyA1LjUzIDAgMCAxLTEuNzctMi4zNEwxNi40OSA1bC0uMzguMjJBMTkgMTkgMCAwIDEgNi44IDcuMzhhLjUyLjUyIDAgMCAwLS40Mi4xNmMtLjIzLjI0LS4xNS42NS0uMDcgMS4wOCAwIC4xMSAwIC4yMi4wNS4zMmExLjQgMS40IDAgMCAwLS41OCAwYy0uMS0xLjQ1LS4wNi00LjY4IDEuODktNi43MVpNNi4zOCA5Yy0uNjUtLjA4LTEgLjEtMS4xNC43OWEyLjA2IDIuMDYgMCAwIDAgMS4zNyAyLjI5TTE4LjU2IDljLjY1LS4wOCAxLjA1LjEgMS4xNC43OWEyLjA2IDIuMDYgMCAwIDEtMS4zNyAyLjI5TTkuNSAxOC4yM1YxNS41TTE1LjUgMTUuNXYyLjczTTIuNSAyNC4xNmMuMjQtMiAuNTktMy42MyAyLjQzLTQuNDlhMjQuMjkgMjQuMjkgMCAwIDEgNC44Mi0xLjM3TTIyLjUgMjQuMzNjLS4yNC0yLS40Mi0zLjgtMi4yNi00LjY2YTI0LjI5IDI0LjI5IDAgMCAwLTQuODItMS4zNyIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTE1LjM5IDE4LjM5YTQuMzcgNC4zNyAwIDAgMS0yLjkxIDEuMDcgNC40MiA0LjQyIDAgMCAxLTIuODktMS4wNSIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTExIDEzaDN2MmgtM3oiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTguMDcgMTJhOS4yMSA5LjIxIDAgMCAxLTUuNTMgMi4wNyIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjwvZz48L3N2Zz4=)}.scylla-icon--tech-talks{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTguMzkgNC41SDIzLjV2MTNoLTE1IiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSI2LjUiIHI9IjIiIHN0eWxlPSJzdHJva2UtbWl0ZXJsaW1pdDoxMDtmaWxsOm5vbmU7c3Ryb2tlOmdyYXkiLz48cGF0aCBkPSJNMS41IDkuNWgybC44Ljg2LjctLjg2aDUuNThhMSAxIDAgMSAxIDAgMkg2LjV2MTAuODhhMSAxIDAgMCAxLTEgMS4xMiAxIDEgMCAwIDEtMS0xIDEgMSAwIDAgMS0xIDEgLjkzLjkzIDAgMCAxLTEtMXYtNmMtLjc4IDAtMi0uNDctMi0xdi01YTEgMSAwIDAgMSAxLTFaIiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.scylla-icon--testing{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTYuNSA2LjVoMTJ2MTJoLTEyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0iTTQuNSA0LjVoMTZ2MTZoLTE2eiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTguNSAxMC41IDUgNSAxMS0xMiIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.scylla-icon--thumbs-up{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy11cCI+PHBhdGggZD0iTTE0IDlWNWEzIDMgMCAwIDAtMy0zbC00IDl2MTFoMTEuMjhhMiAyIDAgMCAwIDItMS43bDEuMzgtOWEyIDIgMCAwIDAtMi0yLjN6TTcgMjJINGEyIDIgMCAwIDEtMi0ydi03YTIgMiAwIDAgMSAyLTJoMyIvPjwvc3ZnPg==)}.scylla-icon--thumbs-down{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIiBjbGFzcz0iZmVhdGhlciBmZWF0aGVyLXRodW1icy1kb3duIj48cGF0aCBkPSJNMTAgMTV2NGEzIDMgMCAwIDAgMyAzbDQtOVYySDUuNzJhMiAyIDAgMCAwLTIgMS43bC0xLjM4IDlhMiAyIDAgMCAwIDIgMi4zem03LTEzaDIuNjdBMi4zMSAyLjMxIDAgMCAxIDIyIDR2N2EyLjMxIDIuMzEgMCAwIDEtMi4zMyAySDE3Ii8+PC9zdmc+)}.scylla-icon--tip{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDI0QzUuNCAyNCAwIDE4LjYgMCAxMlM1LjQgMCAxMiAwczEyIDUuNCAxMiAxMi01LjQgMTItMTIgMTJabTAtMjJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyWiIvPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0xMSAxNmMtLjMgMC0uNS0uMS0uNy0uM2wtMy0zYy0uNC0uNC0uNC0xIDAtMS40LjQtLjQgMS0uNCAxLjQgMGwzIDNjLjQuNC40IDEgMCAxLjQtLjIuMi0uNC4zLS43LjNaIi8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTExIDE2Yy0uMyAwLS41LS4xLS43LS4zLS40LS40LS40LTEgMC0xLjRsNi02Yy40LS40IDEtLjQgMS40IDAgLjQuNC40IDEgMCAxLjRsLTYgNmMtLjIuMi0uNC4zLS43LjNaIi8+PC9zdmc+)}.scylla-icon--training{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfMiIgZGF0YS1uYW1lPSJDYWxxdWUgMiI+PHBhdGggZD0iTTE3LjUgMTUuNUguNXYtMTNoMThNNS41IDI1bDQtNC4zIDQgNC4zIiBjbGFzcz0iY2xzLTEiLz48Y2lyY2xlIGN4PSIyMSIgY3k9IjQiIHI9IjIuNSIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik0yMy40MSA3LjVoLTEuNTJMMjEgOWwtLjktMS41SDEzQTEuOCAxLjggMCAwIDAgMTEuNSA5YTEuOCAxLjggMCAwIDAgMS41IDEuNWg0LjV2MTMuMjRBMS40MSAxLjQxIDAgMCAwIDE5IDI1YTEuNDIgMS40MiAwIDAgMCAxLjUtMS4yMiAxLjUzIDEuNTMgMCAwIDAgMyAwdi03LjExYTEuMTEgMS4xMSAwIDAgMCAxLjA5LTEuMThWOC42N2ExLjE4IDEuMTggMCAwIDAtMS4xOC0xLjE3Wk05LjUgMTUuNDR2NS4zOCIgY2xhc3M9ImNscy0xIi8+PC9nPjwvc3ZnPg==)}.collapsible-button .side-nav__content .toctree-checkbox:checked~label i,.collapsible-button .side-nav__content i,.scylla-icon--triangle-down,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand,.side-nav__content .toctree-checkbox:checked~label .collapsible-button i,.side-nav__content .toctree-checkbox:checked~label .scylla-icon--expand{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSI1IiBmaWxsPSJub25lIj48cGF0aCBmaWxsPSIjM0EyRDU1IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0wIDAgNSA1IDUtNUgwWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+)}.scylla-icon--university{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMXtmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0ibTEuNSA4LjUgMTEtNCAxMSA0djNsLTExIDQtMTEtNHYtM3oiIGNsYXNzPSJjbHMtMSIvPjxwYXRoIGQ9Ik01LjUgMTIuNXY1YTEyLjQ2IDEyLjQ2IDAgMCAwIDcgMiAxMS4yIDExLjIgMCAwIDAgNy0ydi01IiBjbGFzcz0iY2xzLTEiLz48cGF0aCBkPSJtMTMuNSA5LjUgOCAxLjIzdjguNzdNMjIuNSAxNi41djMiIGNsYXNzPSJjbHMtMSIvPjwvZz48L3N2Zz4=)}.scylla-icon--users-blog{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTIzLjUgMi41aC0yMnYxNmgxM3Y0LjE3bDQuMDQtNC4xNyA0Ljk2LS4wNFYyLjV6IiBzdHlsZT0ic3Ryb2tlLXdpZHRoOi45OHB4O2ZpbGw6bm9uZTtzdHJva2U6Z3JheTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQiLz48cGF0aCBkPSJNMTAuODUgOEExMC4zOCAxMC4zOCAwIDAgMSAxMSA5LjVjMCAyLjQ3LTEuMjEgNC0zIDRzLTMuNS0yLTMuNS00LjVhNC4xOCA0LjE4IDAgMCAxIDAtMSIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0iTTUuMiA1LjA3YTMuMjIgMy4yMiAwIDAgMSAyLjUtMSAzLjE2IDMuMTYgMCAwIDEgMi40IDEgNi4yMiA2LjIyIDAgMCAxIDEuMyAzLjgxLjc0Ljc0IDAgMCAwLS40MiAwYzAtLjI0IDAtLjQ0LS4wNS0uNjZoMEEzIDMgMCAwIDEgMTAgNi45di0uMjRsLS4yMS4xMkE5LjYyIDkuNjIgMCAwIDEgNC43MyA4YS4yNS4yNSAwIDAgMC0uMjIuMDljLS4xMy4xNC0uMDkuMzcgMCAuNjF2LjE4YS44NS44NSAwIDAgMC0uMzIgMEE1LjM3IDUuMzcgMCAwIDEgNS4yIDUuMDdaTTQuNTEgOC45M2MtLjM1IDAtLjU3LjA1LS42MS40NGExLjE3IDEuMTcgMCAwIDAgLjczIDEuM00xMSA4LjkzYy4zNiAwIC41Ny4wNS42Mi40NGExLjE3IDEuMTcgMCAwIDEtLjc0IDEuM002LjMxIDE0LjEzdi0uODRNOS4yNSAxMy4xOXYuOTRNMi40MiAxOGMuMTMtMS4xNS41OC0yLjUyIDEuNTgtM2ExNC43MSAxNC43MSAwIDAgMSAyLjMxLS44Mk0xMy41IDE4Yy0uMTMtMS4xNS0uNTEtMi41Mi0xLjUtM3MtMi41LTEtMi41LTEiIGNsYXNzPSJjbHMtMiIvPjxwYXRoIGQ9Ik05LjM0IDE0LjIyYTIuMjMgMi4yMyAwIDAgMS0xLjU2LjYxIDIuMzIgMi4zMiAwIDAgMS0xLjU1LS41OU0yMS41IDYuNWgtN00yMS41IDkuNWgtN00xOC41IDEyLjVoLTQiIGNsYXNzPSJjbHMtMiIvPjwvZz48L3N2Zz4=)}.admonition.caution .admonition-title:before,.admonition.warning .admonition-title:before,.scylla-icon--warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PG1hc2sgaWQ9ImEiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyMSIgeD0iMCIgeT0iMSIgbWFzay10eXBlPSJhbHBoYSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTMuNSAyMmMtLjUgMC0xLS4xLTEuNS0uNEMuNiAyMC44LjEgMTguOS45IDE3LjVMOS40IDMuM2MuMy0uNC42LS44IDEtMSAuNy0uNCAxLjUtLjUgMi4zLS4zLjguMiAxLjQuNyAxLjkgMS40TDIzIDE3LjVjLjMuNS40IDEgLjQgMS41IDAgLjgtLjMgMS42LS45IDIuMS0uNS42LTEuMi45LTIgLjloLTE3Wm03LjYtMTcuNkwyLjcgMTguNWMtLjMuNS0uMSAxLjEuNCAxLjQuMS4xLjMuMS40LjFoMTYuOWMuMyAwIC41LS4xLjctLjMuMi0uMi4zLS40LjMtLjcgMC0uMiAwLS4zLS4xLS41TDEyLjkgNC40Yy0uMy0uNS0uOS0uNi0xLjQtLjQtLjIuMS0uMy4yLS40LjRaIi8+PHBhdGggZmlsbD0iIzA2MTkzOCIgZD0iTTEyIDE0Yy0uNiAwLTEtLjQtMS0xVjljMC0uNi40LTEgMS0xczEgLjQgMSAxdjRjMCAuNi0uNCAxLTEgMVpNMTIgMThjLS4zIDAtLjUtLjEtLjctLjMtLjItLjItLjMtLjQtLjMtLjcgMC0uMSAwLS4zLjEtLjQuMS0uMS4xLS4yLjItLjMuMS0uMS4yLS4yLjMtLjIuMi0uMS40LS4xLjYtLjEuMSAwIC4xIDAgLjIuMS4xIDAgLjEgMCAuMi4xIDAgMCAuMS4xLjIuMS4xLjEuMi4yLjIuMyAwIC4xLjEuMy4xLjQgMCAuMy0uMS41LS4zLjctLjMuMi0uNS4zLS44LjNaIi8+PC9tYXNrPjxnIG1hc2s9InVybCgjYSkiPjxwYXRoIGZpbGw9IiMwNjE5MzgiIGQ9Ik0wIDBoMjR2MjRIMHoiLz48L2c+PC9zdmc+)}.scylla-icon--webinars{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgc3R5bGU9InN0cm9rZS1taXRlcmxpbWl0OjEwO2ZpbGw6bm9uZTtzdHJva2U6Z3JheSIvPjxwYXRoIGQ9Ik05LjQ3IDIwLjV2MS44OE0xNS41IDIwLjV2Mk02LjUgMjIuNWgxMiIgY2xhc3M9ImNscy0yIi8+PHBhdGggZD0ibTkgOSA3LjUgMy41M0w5IDE2Vjl6IiBzdHlsZT0iZmlsbDpncmF5Ii8+PC9nPjwvc3ZnPg==)}.scylla-icon--whitepapers{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMntmaWxsOm5vbmU7c3Ryb2tlOmdyYXk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTggOWg4djJIOHoiIHN0eWxlPSJmaWxsOmdyYXkiLz48cGF0aCBkPSJNMTQuMDYgMS41IDMuNSAxLjUyVjIzLjVoMTdWN2wtNi40NC01LjV6IiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJNMTQuMzIgMS40MnYzLjM3YTIuMDYgMi4wNiAwIDAgMCAyLjA4IDIuMWgzLjY3IiBzdHlsZT0ic3Ryb2tlLW1pdGVybGltaXQ6MTA7ZmlsbDpub25lO3N0cm9rZTpncmF5Ii8+PHBhdGggZD0iTTYuNSAxOS41aDRNMTMuNSAxOS41aDRNNi41IDE2LjVoNE0xMy41IDE2LjVoNE02LjUgMTMuNWg0TTEzLjUgMTMuNWg0IiBjbGFzcz0iY2xzLTIiLz48L2c+PC9zdmc+)}.scylla-icon--workshop{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNSAyNSI+PGRlZnM+PHN0eWxlPi5jbHMtMSwuY2xzLTJ7ZmlsbDpub25lO3N0cm9rZTojNGQ0ZDRkfS5jbHMtMXtzdHJva2UtbWl0ZXJsaW1pdDoxMH0uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kfTwvc3R5bGU+PC9kZWZzPjxnIGlkPSJDYWxxdWVfNCIgZGF0YS1uYW1lPSJDYWxxdWUgNCI+PHBhdGggZD0iTTEuNSA1LjVoMjJ2MTRoLTIyeiIgY2xhc3M9ImNscy0xIi8+PHBhdGggZD0ibTkuNSAxOS41LS4wMyAyLjg4TTE1LjUgMTkuNXYzTTYuNSAyMi41aDEyIiBjbGFzcz0iY2xzLTIiLz48cGF0aCBkPSJtNCA4IDIgOCAuOTctMy45NUwxMSAxMiA0IDh6IiBzdHlsZT0iZmlsbDojNGQ0ZDRkIi8+PHBhdGggZD0ibTYuNDcgMTEuMzQgMy4zNyA0LjI4IiBjbGFzcz0iY2xzLTEiLz48L2c+PC9zdmc+)}.button{border:1px solid #3a2d55;border-radius:4px;display:inline;font-size:14px;letter-spacing:1px;line-height:21px;margin:0;padding:12px 14px}.button,.button:focus,.button:hover{background:transparent;color:#3a2d55}.button:focus,.button:hover{text-decoration:none}.button--reverse{background:#fff;border:0}.button--reverse:focus,.button--reverse:hover{background:#fff}.tooltip{background-color:rgba(0,0,0,.56);border-radius:4px;font-size:12px;padding:6px}.tooltip:before,.tooltip:empty{display:none!important}.has-tip{border:0;cursor:pointer}.scylla-dropdown{color:#23263b;font-size:14px;line-height:20px}.scylla-dropdown a,.scylla-dropdown a:focus,.scylla-dropdown a:hover{color:#23263b!important;padding:0!important}.scylla-dropdown__item{font-size:16px;padding:15px}.scylla-dropdown__title{align-items:center;display:flex!important;position:static!important}.scylla-dropdown__title:after{display:none!important}.scylla-dropdown__title .chevron{min-height:5px;width:10px}.scylla-dropdown__content{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);font-size:16px;list-style:none;margin-top:15px;overflow:hidden;padding:16px 0;width:max-content}.scylla-dropdown__content li{padding:7px 16px}.scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown__content .secondary-side-nav__content li a:before,.scylla-dropdown__content li .admonition-title:before,.scylla-dropdown__content li .scylla-icon,.secondary-side-nav__content .scylla-dropdown__content li a:before{margin-right:10px}.enlarge-image{cursor:zoom-in}.enlarge-image-reveal{background:transparent;border:none;cursor:zoom-out;padding:0;text-align:center;width:fit-content}.enlarge-image-reveal img{background-color:#fff;padding:15px}.header{background-color:#fff;box-shadow:0 2px 22px rgba(74,93,166,.15);justify-content:space-between;padding:12.75px 0;position:fixed;width:100%;z-index:99}.header,.header-logo{align-items:center;display:flex}.header-logo{margin-left:20px;width:auto}.header-logo__img{width:110px}.header-logo__bar{background-color:#3a2d55;border-left:1px solid #3a2d55;height:11.56px;margin:0 7.5px;width:0}.header-logo__text{color:#3a2d55;font-size:10.11px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{display:none}.header-button{display:none;margin-left:15px;text-transform:uppercase}.header-search-box{display:none;margin-right:20px;width:200px}.scylla-dropdown--header .scylla-dropdown__item{font-size:14px}.scylla-dropdown--header .scylla-dropdown__title{text-transform:uppercase}.scylla-dropdown--header .scylla-dropdown__title .chevron{margin-left:10px}.contents.local>ul>li .scylla-dropdown--header .scylla-dropdown__content a:before,.scylla-dropdown--header .scylla-dropdown__content .admonition-title:before,.scylla-dropdown--header .scylla-dropdown__content .contents.local>ul>li a:before,.scylla-dropdown--header .scylla-dropdown__content .scylla-icon,.scylla-dropdown--header .scylla-dropdown__content .secondary-side-nav__content li a:before,.secondary-side-nav__content li .scylla-dropdown--header .scylla-dropdown__content a:before{min-height:20px;width:20px}@media screen and (min-width:1024px){.header{padding:18px 0}.header-logo__img{width:152px}.header-logo__bar{height:16px;margin:0 10px}.header-logo__text{font-size:14px;letter-spacing:.722408px;line-height:12px;text-transform:uppercase}.header-navigation{align-items:center;display:flex;justify-content:center}.header-search-box{display:block}}@media screen and (min-width:1200px){.header-logo{margin-left:30px;width:357px}.header-search-box{margin-right:30px;max-width:20%;width:318px}.header-button{display:block}}.side-nav{background:#fff;display:none;height:100vh;left:0;line-height:24px;max-height:calc(100vh - 50px);overflow-y:auto;padding:20px 20px 0;position:fixed;top:50px;width:100%;z-index:100}.side-nav__title{font-weight:700;margin-bottom:20px}.side-nav__content{max-width:90%;overflow-wrap:break-word}.side-nav__content label,.side-nav__content label i{margin:0;padding:0}.side-nav__content label{font-size:inherit;line-height:1;margin-left:5px;max-height:5px}.collapsible-button .side-nav__content i,.side-nav__content .collapsible-button i,.side-nav__content .scylla-icon--expand{height:5px;vertical-align:top;width:10px}.side-nav__content .toctree-checkbox{display:none;position:absolute;right:20px}.side-nav__content .toctree-checkbox~ul{display:none;margin-right:20px}.side-nav__content .toctree-checkbox:checked~ul{display:block}.side-nav__content ul{margin:0}.side-nav__content a{color:#23263b}.side-nav__content a:hover{color:#3c4fe0;font-weight:400}.side-nav__content li{list-style:none;padding:0 0 24px}.side-nav__content li.has-children{align-items:center;display:flex;flex-wrap:wrap}.side-nav__content li.has-children>a{max-width:calc(100% - 15px)}.side-nav__content li.has-children.current{padding-bottom:20px}.side-nav__content li.has-children:hover>a{color:#3c4fe0}.side-nav__content li.has-children:hover>.toctree-checkbox~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li.current-page>a{color:#3c4fe0}.side-nav__content li.current-page>.toctree-checkbox:checked~label i{filter:invert(38%) sepia(71%) saturate(6789%) hue-rotate(231deg) brightness(90%) contrast(95%)}.side-nav__content li ul{margin-top:18px;width:100%}.side-nav__content li ul li{border-left:1px solid #3c4fe0;padding:4px 0 4px 13px}.side-nav__content li ul ul{margin-left:0}.side-nav__content li .label{display:none}.side-nav__versions{max-width:90%}.side-nav__search,.side-nav__versions .dropdown{margin-bottom:20px}.collapsible-button{background:#fff;background-color:#fff;border:0;border-radius:8px;border-radius:50%;bottom:10px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;left:300px;overflow:hidden;padding:13.5px;position:fixed}.collapsible-button i{height:16px;margin:0;width:16px}.side-nav--collapsed .collapsible-button{border-radius:0 20px 20px 0;left:-10px}.side-nav--collapsed .collapsible-button i{transform:rotate(180deg)}.layout--has-banner .side-nav{max-height:calc(100vh - 92.5px)}@media screen and (min-width:1024px){.side-nav{background-color:#f6f8ff;display:block;height:100%;left:auto;max-height:100vh;max-height:calc(100vh - 80px);padding:30px 40px;top:80px;width:286px;z-index:25}.side-nav__content{max-width:100%;padding-bottom:180px}.side-nav__search{display:none}.side-nav__versions{max-width:100%}.toctree-checkbox{right:40px}.layout--has-banner .side-nav{max-height:calc(100vh - 150px)}}@media screen and (min-width:1200px){.side-nav{width:357px}.side-nav--collapsed{background-color:transparent;padding-left:0;padding-right:0;width:126px}.side-nav--collapsed .side-nav-content{display:none}.collapsible-button{display:block}}.side-nav-toggle{cursor:pointer;display:block;margin-right:20px;position:relative;z-index:300}@media screen and (min-width:1024px){.side-nav-toggle{display:none}}.secondary-side-nav{display:none;height:100%;line-height:24px;padding:20px;width:100%}.secondary-side-nav__content{overflow-wrap:break-word}.secondary-side-nav__content ul{list-style:none;margin:0}.secondary-side-nav__content li{border-bottom:1px solid rgba(90,94,154,.1);display:none;padding:10px 0;word-break:break-word}.secondary-side-nav__content li:last-child{border:0}.secondary-side-nav__content li .label{display:none}.secondary-side-nav__content li a{align-items:baseline;color:#b3bac5;display:flex;font-size:14px}.secondary-side-nav__content li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;flex-shrink:0;margin-right:10px;min-height:10px;opacity:.5;width:6px}.secondary-side-nav__content li a.current,.secondary-side-nav__content li a:hover{color:#23263b;font-weight:400}.secondary-side-nav__content li a.current:before,.secondary-side-nav__content li a:hover:before{filter:brightness(0);opacity:1}.secondary-side-nav__content li a.current{font-weight:700}.secondary-side-nav__content>ul>li>ul>li{display:block}.secondary-side-nav__content>ul>li{border:0;display:block}.secondary-side-nav__content>ul>li>a{display:none}@media screen and (min-width:1200px){.secondary-side-nav{display:block;max-height:100vh;max-height:calc(100vh - 80px);overflow-y:auto;padding:60px 60px 60px 20px;position:fixed;top:80px;width:286px}.secondary-side-nav__content{padding-bottom:180px}.layout--has-banner .secondary-side-nav{max-height:calc(100vh - 150px)}}.layout{display:flex}.pre-content{align-items:center;display:flex;justify-content:space-between;margin-bottom:20px}.content{margin-top:50px;max-width:1440px;overflow-wrap:break-word;padding:20px;width:100%}.content .line-block,.content p{line-height:28px;margin-bottom:20px}.content ul{list-style:none}.content ul li:before{color:#b3bac5;content:"•";float:left;font-family:FontAwesome;font-size:20px;font-weight:700;margin-left:-1em;margin-top:-2px;width:1em}.content ul ul{list-style:circle}.content ul ul li:before{content:""}.content ol ol{list-style:lower-latin}.content img{margin-bottom:30px}.content .inline-icon.fa-check{color:#42c4e6}.layout--full-width .content{max-width:100%;padding:0;width:100%}.layout--full-width .content .hero-wrapper,.layout--full-width .content .topics-grid{max-width:1190px}.layout--full-width .content.content--collapsed,.layout--full-width:not(.layout--sidebar) .content{margin-left:0}.landing__content{padding:0 16px}@media screen and (min-width:1024px){.content{margin-left:286px;margin-top:80px;min-height:calc(100vh - 260px);padding-bottom:100px;width:calc(100% - 286px)}}@media screen and (min-width:1200px){.content{margin-left:357px;padding:60px 40px 40px;width:calc(100% - 643px)}.content--collapsed{margin-left:126px;width:calc(100% - 412px)}.pre-content{margin-bottom:10px}.landing__content{padding:0 60px}.landing--floating .landing__content{position:relative;top:-70px}}.contents.local>ul{margin-bottom:30px;margin-left:0}.contents.local>ul>li{border-bottom:1px solid rgba(90,94,154,.1);padding:10px 0;word-break:break-word}.contents.local>ul>li:before{content:""}.contents.local>ul>li:last-child{border:0}.contents.local>ul>li ul{display:none}.contents.local>ul>li p{margin:0}.contents.local>ul>li a{font-size:14px}.contents.local>ul>li a:before{content:"";filter:invert(40%) sepia(11%) saturate(2157%) hue-rotate(198deg) brightness(89%) contrast(87%)!important;margin-right:10px;min-height:10px;opacity:.5;width:10px}.contents.local>ul>li a.current:before,.contents.local>ul>li a:hover:before{filter:brightness(0);opacity:1}.topic-title{color:rgba(35,38,59,.75);font-size:10px;letter-spacing:1.5px;margin-bottom:0;text-transform:uppercase}.notice{margin-top:40px}.footer{background-color:#fff;box-shadow:0 -4px 10px hsla(0,0%,82%,.25);padding:30px 0;position:relative;width:100%;z-index:50}.footer-group{margin:0 auto;max-width:1030px;padding:0 20px}.footer-top{align-items:center;border-bottom:1px solid rgba(0,0,0,.1);display:flex;flex-wrap:wrap;justify-content:space-between;padding-bottom:8px;text-align:center}.footer-logo{margin-bottom:30px;width:100%}.footer-logo img{float:left;height:36px}.footer-links{text-align:left}.footer-links__link{color:#333;font-size:12px;font-weight:500;letter-spacing:2.4px;margin-right:16px;text-transform:uppercase}.footer-actions{align-items:center;display:flex;justify-content:space-between;width:90px}.footer-actions__link{color:#000}.footer-actions__link img{height:23px}.footer-bottom{color:#979797;display:flex;flex-wrap:wrap;font-size:12px;font-style:normal;font-weight:400;justify-content:center;letter-spacing:1.4px;line-height:23px;padding:20px 0 10px;text-align:center;text-transform:uppercase}@media screen and (max-width:510px){.footer-links{margin-bottom:20px}}@media screen and (min-width:1024px){.footer{padding:30px 0}.footer-group{padding:0}.footer-top{padding-bottom:30px}.footer-logo{margin:0;width:auto}.footer-links{padding:0 40px}.footer-links__link{font-size:14px;margin-right:28px}.footer-actions{width:110px}.footer-actions__link img{height:28px}.footer-bottom .footer-bottom__copyright,.footer-bottom .footer-bottom__last-updated,.footer-bottom .footer-bottom__version{padding:0 10px}.footer-bottom .footer-bottom__copyright{border-left:none}}.not-found{background-color:#f6f8ff;height:100%;overflow:hidden}.not-found__icon{display:block;margin:40px auto;max-width:300px}.not-found__text{text-align:center}.not-found__text h1{font-size:60px;line-height:1}.not-found__text p{margin:30px 0;width:100%}.not-found__button{text-transform:uppercase}.admonition{border-radius:4px;box-shadow:0 4px 4px rgba(0,0,0,.12);color:rgba(0,0,0,.56);font-size:14px;line-height:20px;margin-bottom:30px;overflow:auto;padding:20px 20px 20px 52px;position:relative}.admonition:before{bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.admonition-title{color:#23263b;left:-32px;position:relative}.admonition-title:before{content:"";margin-right:8px;min-height:24px;width:24px}.admonition p{margin-bottom:0!important}.admonition.tip{border:1px solid #43a047}.admonition.tip:before{border-left:8px solid rgba(67,160,71,.4)}.admonition.tip .admonition-title:before{filter:invert(47%) sepia(11%) saturate(2286%) hue-rotate(73deg) brightness(109%) contrast(88%)}.admonition.note{border:1px solid #1976d2}.admonition.note:before{border-left:8px solid rgba(25,118,210,.4)}.admonition.note .admonition-title:before{filter:invert(44%) sepia(55%) saturate(2310%) hue-rotate(191deg) brightness(81%) contrast(103%)}.admonition.caution{border:1px solid #ffab00}.admonition.caution:before{border-left:8px solid rgba(255,171,0,.4)}.admonition.caution .admonition-title:before{filter:invert(77%) sepia(56%) saturate(3332%) hue-rotate(357deg) brightness(98%) contrast(108%)}.admonition.warning{border:1px solid #e74c3c}.admonition.warning:before{border-left:8px solid rgba(231,76,60,.4)}.admonition.warning .admonition-title:before{filter:invert(41%) sepia(42%) saturate(6427%) hue-rotate(343deg) brightness(99%) contrast(83%)}.breadcrumbs{margin-bottom:0;text-transform:uppercase}.breadcrumbs .bread__item,.breadcrumbs .bread__item:not(.bread__item--last):after,.breadcrumbs a{color:#23263b;font-size:12px;font-weight:400;letter-spacing:1.5px;line-height:2;margin:0;padding:0}.breadcrumbs .bread__item:before{display:none}.breadcrumbs .bread__item:not(.bread__item--last):after{content:"/";margin:0 5px;opacity:1;position:relative}.breadcrumbs .bread__highlight{color:#3c4fe0}.breadcrumbs .bread__highlight:hover{font-weight:700;text-decoration:none}code{background-color:#f7f8f9;border:none;border-radius:4px;color:#23263b;font-size:14px}code.download{background:none;color:#23263b}.highlight{background:transparent!important}.highlight pre{background-color:#f7f8f9;border-radius:8px;color:#23263b;font-size:14px;line-height:26px;margin-bottom:30px;overflow:auto;padding:16px}.highlight a.copybtn{right:1em;top:1em}.highlighttable{background-color:#f7f8f9;border-radius:16px;box-shadow:none}.highlighttable tbody{background-color:transparent;border:0}.highlighttable tbody td{padding:15px!important}.highlighttable tbody tr{border-top:none}.highlighttable .linenos{background-color:#f7f8f9;color:#5a7184;width:50px}.highlighttable .linenos span{line-height:26px}.highlighttable .highlight pre{background-color:transparent;margin:0;padding:0}.highlighttable .highlight a.copybtn{right:.2em;top:.2em}.hide-copy-button .copybtn{display:none}.sphinx_collapse__label{display:flex!important;flex-direction:row-reverse;font-size:medium;font-weight:700;justify-content:flex-end;margin-left:0!important}.sphinx_collapse__icon{margin-left:5px;margin-right:0}.sphinx_collapse__input:checked~.sphinx_collapse__label,.sphinx_collapse__label:hover{color:#3c4fe0}.sphinx_collapse__input:checked~.sphinx_collapse__label .sphinx_collapse__icon,.sphinx_collapse__label:hover .sphinx_collapse__icon{border-top-color:#3c4fe0}.sphinx_collapse__content{margin-top:10px}.contribute{margin:0 0 20px}.contribute__item{font-size:14px;list-style:none;padding-bottom:10px}.contribute__item .icon{margin-right:5px}.content-navigation{display:flex;justify-content:space-between;margin-top:40px}.navigation{max-width:50%;word-break:break-word}.navigation,.navigation__link{display:flex}.navigation__title{word-wrap:break-word;color:#23263b;font-size:12px;font-weight:500;letter-spacing:1.5px;line-height:24px;text-transform:uppercase}.navigation__title .colored{color:#42c4e6}.navigation__button{background:#fff;background-color:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;display:none;font-size:0;height:fit-content;overflow:hidden;padding:13.5px 16.5px}.navigation__button i{height:16px;margin:0;width:10px}.navigation--prev .navigation__title{margin-left:15px}.navigation--next .navigation__title{margin-right:15px;text-align:right}@media screen and (min-width:1200px){.navigation__title{display:inline-block}.navigation__button{display:block}.navigation--next .navigation__title{text-align:left}}.scylla-dropdown--versions .scylla-dropdown__item{background:#fff;border-radius:8px;box-shadow:0 28px 32px rgba(0,0,0,.06);width:100%}.scylla-dropdown--versions .scylla-dropdown__title{align-items:center;display:flex;justify-content:space-between}.scylla-dropdown--versions .scylla-dropdown__title .chevron{min-height:12px;transform:rotate(90deg);width:8px}@media screen and (min-width:1024px){.scylla-dropdown--versions .scylla-dropdown__item{box-shadow:none}}.feedback-container{font-size:16px;margin-top:40px;text-align:left}.feedback-container__title{font-weight:700;margin-bottom:5px!important}.feedback-container__button{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);cursor:pointer;margin:4px;overflow:hidden;padding:8px}.feedback-container__button.active{border:1px solid #3c4fe0}.feedback-container__icon{height:20px;width:20px}.feedback-container__message{font-size:16px;margin-top:10px}.hero{background:#f6f8ff;margin-bottom:30px;overflow:hidden;padding:30px 16px;text-align:left}.hero__title{font-size:28px;font-weight:500;line-height:38px;margin-bottom:14px;max-width:229px}.hero__text{font-size:16px;line-height:26px;max-width:343px}.hero__text a{border-bottom:1px dotted #23263b;color:#23263b}.hero__text p{margin-bottom:0!important}.hero__img{position:absolute;right:-18px;top:20px}.hero__img img{margin-bottom:0!important;width:124px}.hero__button{margin-top:20px;text-transform:uppercase}.hero__button .icon{margin-right:5px}.hero__search-box{box-shadow:0 4px 25px rgba(0,0,0,.02);margin-top:20px}.hero-wrapper{align-items:center;display:flex;justify-content:space-between;margin:0 auto;position:relative}@media screen and (min-width:640px){.hero{padding:60px 16px}.hero__title{font-size:32px;line-height:42px;max-width:482px}.hero__text{font-size:18px;line-height:26px;max-width:482px}.hero__img{display:block;position:static}.hero__img img{height:100%;width:295px}.hero .hero-wrapper{flex-direction:row-reverse}.hero .landing--floating .hero{padding:30px 16px 100px}}@media screen and (min-width:1024px){.hero{padding:60px}}.label{background-color:#23263b;border:0;border-radius:4px;color:#fff;font-size:inherit}.label--note{background-color:#1976d2}.label--tip{background-color:#43a047}.label--caution{background-color:#ffab00}.label--warning{background-color:#e74c3c}.last-updated{color:#4458a3;font-size:12px;letter-spacing:1.5px;margin:10px 0;text-transform:uppercase}.last-updated__icon{font-size:14px}@media screen and (min-width:1024px){.last-updated{float:right;margin:0}}.panel{border:0;border-radius:4px;margin-bottom:30px}.promo-banner{background-color:#4458a3;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNDQwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIj48bWFzayBpZD0iYSIgd2lkdGg9IjE0NDAiIGhlaWdodD0iNzAiIHg9IjAiIHk9IjAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiPjxwYXRoIGZpbGw9IiM0NDU4QTMiIGQ9Ik0wIDBoMTQ0MHY3MEgweiIvPjwvbWFzaz48ZyBmaWxsPSIjNTA2NEFFIiBtYXNrPSJ1cmwoI2EpIj48cGF0aCBkPSJNLTE5MyAyMDEuODg0IDEuNS0xMzUgMzU3LjQzNiA3MC41bC0xOTQuNSAzMzYuODg0ek0xMDkyLjkyLTM4LjAwOSA5NzIuODAzLTI0Ni4wNTcgNDAyLjk5NiA4Mi45MiA1MjMuMTEzIDI5MC45N3oiLz48cGF0aCBkPSJtMTAzOC0zOC4wMDkgMTIwLjExNy0yMDguMDQ5IDU2OS44MDcgMzI4Ljk3OS0xMjAuMTE3IDIwOC4wNDl6Ii8+PC9nPjwvc3ZnPg==);background-position:50%;background-repeat:no-repeat;background-size:cover;display:none;overflow:hidden;position:fixed;top:0;width:100%;z-index:900}.promo-banner__icon{margin-right:15px}.promo-banner__icon img{height:40px}.promo-banner__title{color:#fff;font-size:12px;line-height:16px;margin-right:15px}.promo-banner__button{background:#fff;border-radius:4px;font-size:12px;min-width:max-content;padding:5px}.promo-banner__close{display:none;position:absolute;right:16px;top:16px}.contents.local>ul>li .promo-banner__close a:before,.promo-banner__close .admonition-title:before,.promo-banner__close .contents.local>ul>li a:before,.promo-banner__close .scylla-icon,.promo-banner__close .secondary-side-nav__content li a:before,.secondary-side-nav__content li .promo-banner__close a:before{filter:brightness(100%);height:34px;width:34px}.promo-banner__close:hover{cursor:pointer;filter:opacity(.8)}.promo-banner-wrapper{align-items:center;display:flex;justify-content:center;padding:5.85px 20px}@media(min-width:1024px){.promo-banner__title{font-size:18px;line-height:23px}.promo-banner__button{font-size:14px;padding:8.5px}.promo-banner__close{display:block}.promo-banner-wrapper{flex-direction:unset;padding:16px}}.custom-scroll-bar::-webkit-scrollbar{background-color:transparent;width:5px}.custom-scroll-bar::-webkit-scrollbar-thumb{background-color:#b3bac5;-webkit-border-radius:8px;border-radius:8px}.search-box{background:#f7f8f9;border-radius:4px;display:flex;padding:10px 15px}.search-box--hero{background-color:#fff;padding:12px 14px}.search-box:before{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTEwLjUgMThhNy41IDcuNSAwIDEgMCAwLTE1IDcuNSA3LjUgMCAwIDAgMCAxNVpNMjEgMjFsLTUuMi01LjIiLz48L3N2Zz4=);background-repeat:no-repeat;background-size:contain;content:"";display:inline-block;filter:brightness(0);margin-top:2px;min-height:18px;min-width:18px;vertical-align:middle;width:20px}.search-box .er-dummy-search,.search-box .er-dummy-search-box,.search-box .er-search-form,.search-box ci-search,.search-box input{margin:0!important;width:100%!important}.search-box input{background:transparent!important;color:rgba(80,80,80,.5)!important;font-size:14px!important;padding:0!important}.search-box input::placeholder{color:rgba(80,80,80,.5)!important;opacity:1!important}.search-box button{display:none!important}.er_search_suggestions{background:#fff;border:0;border:0!important;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}.er_search_suggestions .er-search-result-box{border-width:1px!important;padding-bottom:10px!important;padding-top:10px!important}.er_search_suggestions .er-search-result-box:hover{background:#f7f8f9!important}.er_search_suggestions .er_more_result_btn{cursor:pointer}.er_search_suggestions h3{font-size:16px!important}.er-search-content{padding:20px!important}#er_search_results .er-search-result-box{display:block!important;margin:10px auto 0!important;width:100%!important}#er_search_results .text,#er_search_results .title a,#er_search_results .url a{max-width:100%!important}#search-result-input-form{max-width:800px!important}#er_search_button{text-align:center}#er_clear_input{right:0!important;top:0!important}.er-facet-header{background-color:transparent!important;border:0!important;padding:0 0 8px!important}.er-facet-val{padding:5px 2px!important}.er-facet-val input{display:block!important;margin:0}#er_search_pagination{margin-top:20px!important}#er_search_pagination li.er-paginator-list.er-active{border-bottom:0!important;font-weight:700}.er-suggestion-sm .er_search_input_dummy{margin:0!important}.er-suggestion-sm .er_search_button_dummy{border:0!important}#er_gcs_mobile_model_container .er-facet-values .er-facet-val{align-items:baseline}@media screen and (min-width:640px){.er-facets{display:none;max-width:300px!important;min-width:auto!important;width:auto!important}}@media screen and (min-width:1024px){.er-suggestions{left:15px!important}}@media screen and (min-width:1200px){.er-facets{display:block;position:fixed!important}.er-facet-count{display:none}}.sphinx-tabs{margin-bottom:30px}.sphinx-tabs-tab{border-bottom:1px solid rgba(0,0,0,.56);color:rgba(0,0,0,.56);cursor:pointer;font-size:14px;font-weight:500;line-height:13px;padding:20px 25px}.sphinx-tabs-tab[aria-selected=true]{border-bottom:2px solid #2196f3;color:#2196f3;padding-bottom:19px}.sphinx-tabs-panel{margin:30px 0}.table-wrapper{border:1px solid #e0e0e0;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,.25);display:block;margin-bottom:30px;max-width:100%;overflow-x:auto}table{color:#000;font-size:14px;line-height:24px;margin:0;overflow:hidden}table p{margin:0!important}table caption{background:#f6f8ff;border-bottom:1px solid #e0e0e0;color:#23263b;padding:10px 25px}table thead{background:#f6f8ff;border:0;border-bottom:1px solid #4458a3}table thead th{color:#23263b;font-size:14px;font-weight:700}table td,table thead th{padding:20px 25px}table tbody tr{background-color:transparent!important;border-top:1px solid #e0e0e0;line-height:18px}table:not(.highlighttable) tbody tr:first-child{border-top:1px solid #4458a3}table.thead-border thead .row-odd th{color:#23263b}table.thead-border thead .row-even th{font-weight:400}table.thead-border thead th{border:1px solid #e0e0e0}table.thead-border thead tr:first-child th{border-top:none}table.thead-border thead tr:last-child th{border-bottom:none}table.thead-border thead tr th:first-child{border-left:none}table.thead-border thead tr th:last-child{border-right:none}.topics-grid{display:block;margin:0 auto 30px}.topics-grid__title{color:#23263b;font-size:24px;font-weight:700;line-height:32px;margin-bottom:6px}.topics-grid__text{color:#4458a3;font-size:18px;line-height:24px}.topics-grid--scrollable .hs{-ms-overflow-style:none;display:grid;grid-auto-flow:column;overflow-x:scroll;padding:20px 10px;scrollbar-width:none}.topics-grid--scrollable .hs::-webkit-scrollbar{display:none}.topics-grid--scrollable .hs .topic-box:last-child:after{content:"";width:20px}.topic-box{align-items:stretch;display:flex}.topic-box .card{background:#fff;border:1px solid transparent;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);display:flex;flex-direction:column;font-size:18px;margin:0 auto 30px;overflow:hidden;padding:20px;position:relative}.topic-box .card:hover{border:1px solid #4458a3;color:#23263b;font-weight:400}.topic-box__title{color:#23263b;font-size:16px;font-weight:700;line-height:24px;margin-bottom:0}.topic-box__title img{bottom:0;opacity:.3;position:absolute;right:0;top:0}.topic-box__body{color:#000;display:flex;flex-direction:column;flex-grow:1;max-width:80%}.topic-box__body .container{flex-grow:1;margin:0;padding:0}.topic-box__body .line-block,.topic-box__body p{font-size:16px;line-height:19px;margin-top:10px}.topic-box__anchor{color:#42c4e6;font-size:14px;font-weight:700;line-height:24px}.topic-box__icon{display:block;font-size:50px;margin-bottom:20px}.topic-box__icon i{filter:brightness(0);min-height:50px;width:100%}.topic-box__icon img{bottom:-12px;display:none;height:140px;margin:0;opacity:.3;position:absolute;right:-5px}.topic-box--product .card{box-shadow:none;padding:20px;text-align:center}.topic-box--product .card .topic-box__title{color:#23263b;font-size:14px}.topic-box--product .card .topic-box__body{display:flex;flex-direction:column;max-width:100%}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:12px}.topic-box--product .card .topic-box__icon img{display:inline-block;max-height:84px;opacity:1;position:static}.topic-box--product .card:hover{background:#fff;border:0;border-radius:8px;box-shadow:0 4px 25px rgba(0,0,0,.15);overflow:hidden}@media screen and (max-width:1024px){.topics-grid--scrollable .topic-box{width:280px!important}.topic-box--product:nth-last-child(-n+2) .card{margin-bottom:0}}@media screen and (min-width:1024px){.topics-grid{margin-bottom:10px}.topics-grid__text{font-size:16px}.topics-grid--scrollable .hs{display:flex;overflow-x:initial;padding:0}.topics-grid--scrollable .hs .topic-box:last-child:after{display:none}.topic-box .card{margin-bottom:60px;padding:45px 30px}.topic-box__title{font-size:20px;line-height:32px}.topic-box__body .line-block,.topic-box__body p{font-size:18px;line-height:26px}.topic-box__anchor{font-size:20px;line-height:26px}.topic-box .topic-box__icon img{display:inline-block}.topic-box--product .card{padding:20px}.topic-box--product .card .topic-box__title{font-size:18px;line-height:24px}.topic-box--product .card .topic-box__body .line-block,.topic-box--product .card .topic-box__body p{font-size:14px}.topic-box--product .card .topic-box__icon img{max-height:111px}.landing .topics-grid--products{margin-bottom:40px}} \ No newline at end of file diff --git a/stable/_static/doctools.js b/stable/_static/doctools.js new file mode 100644 index 000000000..d06a71d75 --- /dev/null +++ b/stable/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/stable/_static/documentation_options.js b/stable/_static/documentation_options.js new file mode 100644 index 000000000..7e4c114f2 --- /dev/null +++ b/stable/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/stable/_static/file.png b/stable/_static/file.png new file mode 100644 index 000000000..a858a410e Binary files /dev/null and b/stable/_static/file.png differ diff --git a/stable/_static/img/banner-background.svg b/stable/_static/img/banner-background.svg new file mode 100644 index 000000000..f8520d5b3 --- /dev/null +++ b/stable/_static/img/banner-background.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stable/_static/img/favicon-228x228.png b/stable/_static/img/favicon-228x228.png new file mode 100644 index 000000000..f30770c7e Binary files /dev/null and b/stable/_static/img/favicon-228x228.png differ diff --git a/stable/_static/img/favicon-32x32.png b/stable/_static/img/favicon-32x32.png new file mode 100644 index 000000000..aae1708f2 Binary files /dev/null and b/stable/_static/img/favicon-32x32.png differ diff --git a/stable/_static/img/favicon.ico b/stable/_static/img/favicon.ico new file mode 100644 index 000000000..6c7484f08 Binary files /dev/null and b/stable/_static/img/favicon.ico differ diff --git a/stable/_static/img/icons/icon-about-team.svg b/stable/_static/img/icons/icon-about-team.svg new file mode 100644 index 000000000..5448c7f00 --- /dev/null +++ b/stable/_static/img/icons/icon-about-team.svg @@ -0,0 +1 @@ +icon-about-team diff --git a/stable/_static/img/icons/icon-about-us-m.svg b/stable/_static/img/icons/icon-about-us-m.svg new file mode 100644 index 000000000..09107d952 --- /dev/null +++ b/stable/_static/img/icons/icon-about-us-m.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-about-us.svg b/stable/_static/img/icons/icon-about-us.svg new file mode 100644 index 000000000..1b1fcc83e --- /dev/null +++ b/stable/_static/img/icons/icon-about-us.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-alternator.svg b/stable/_static/img/icons/icon-alternator.svg new file mode 100644 index 000000000..7c2b4ebae --- /dev/null +++ b/stable/_static/img/icons/icon-alternator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-apps.svg b/stable/_static/img/icons/icon-apps.svg new file mode 100644 index 000000000..7e9361202 --- /dev/null +++ b/stable/_static/img/icons/icon-apps.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-architecture.svg b/stable/_static/img/icons/icon-architecture.svg new file mode 100644 index 000000000..67ebbc2f3 --- /dev/null +++ b/stable/_static/img/icons/icon-architecture.svg @@ -0,0 +1 @@ +icon-architecture diff --git a/stable/_static/img/icons/icon-benchmarks.svg b/stable/_static/img/icons/icon-benchmarks.svg new file mode 100644 index 000000000..e1ce2c1d7 --- /dev/null +++ b/stable/_static/img/icons/icon-benchmarks.svg @@ -0,0 +1 @@ +icon-benchmarks diff --git a/stable/_static/img/icons/icon-blog.svg b/stable/_static/img/icons/icon-blog.svg new file mode 100644 index 000000000..f4096cbf1 --- /dev/null +++ b/stable/_static/img/icons/icon-blog.svg @@ -0,0 +1 @@ +icon-blog2 diff --git a/stable/_static/img/icons/icon-careers.svg b/stable/_static/img/icons/icon-careers.svg new file mode 100644 index 000000000..2a7c6ea0b --- /dev/null +++ b/stable/_static/img/icons/icon-careers.svg @@ -0,0 +1 @@ +icon-careers diff --git a/stable/_static/img/icons/icon-chevron-left.svg b/stable/_static/img/icons/icon-chevron-left.svg new file mode 100644 index 000000000..3afa25c48 --- /dev/null +++ b/stable/_static/img/icons/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/icons/icon-chevron-right.svg b/stable/_static/img/icons/icon-chevron-right.svg new file mode 100644 index 000000000..44eb829cd --- /dev/null +++ b/stable/_static/img/icons/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/icons/icon-circe.svg b/stable/_static/img/icons/icon-circe.svg new file mode 100644 index 000000000..875e42167 --- /dev/null +++ b/stable/_static/img/icons/icon-circe.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-clock.svg b/stable/_static/img/icons/icon-clock.svg new file mode 100644 index 000000000..8c9246980 --- /dev/null +++ b/stable/_static/img/icons/icon-clock.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-close.svg b/stable/_static/img/icons/icon-close.svg new file mode 100644 index 000000000..d1162b73e --- /dev/null +++ b/stable/_static/img/icons/icon-close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-cloud-docs.svg b/stable/_static/img/icons/icon-cloud-docs.svg new file mode 100644 index 000000000..a9069bb6e --- /dev/null +++ b/stable/_static/img/icons/icon-cloud-docs.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-cloud.svg b/stable/_static/img/icons/icon-cloud.svg new file mode 100644 index 000000000..cfb2318da --- /dev/null +++ b/stable/_static/img/icons/icon-cloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-comparison.svg b/stable/_static/img/icons/icon-comparison.svg new file mode 100644 index 000000000..49d809a5d --- /dev/null +++ b/stable/_static/img/icons/icon-comparison.svg @@ -0,0 +1 @@ +icon-comparison diff --git a/stable/_static/img/icons/icon-contact-us.svg b/stable/_static/img/icons/icon-contact-us.svg new file mode 100644 index 000000000..9df3145dd --- /dev/null +++ b/stable/_static/img/icons/icon-contact-us.svg @@ -0,0 +1 @@ +icon-contact-us diff --git a/stable/_static/img/icons/icon-developers-blog.svg b/stable/_static/img/icons/icon-developers-blog.svg new file mode 100644 index 000000000..ee804197a --- /dev/null +++ b/stable/_static/img/icons/icon-developers-blog.svg @@ -0,0 +1 @@ +icon-developers-blog diff --git a/stable/_static/img/icons/icon-docs.svg b/stable/_static/img/icons/icon-docs.svg new file mode 100644 index 000000000..5501492f3 --- /dev/null +++ b/stable/_static/img/icons/icon-docs.svg @@ -0,0 +1 @@ +icon-docs diff --git a/stable/_static/img/icons/icon-enterprise-m.svg b/stable/_static/img/icons/icon-enterprise-m.svg new file mode 100644 index 000000000..97be900b5 --- /dev/null +++ b/stable/_static/img/icons/icon-enterprise-m.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-enterprise.svg b/stable/_static/img/icons/icon-enterprise.svg new file mode 100644 index 000000000..ee1ac2628 --- /dev/null +++ b/stable/_static/img/icons/icon-enterprise.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-events.svg b/stable/_static/img/icons/icon-events.svg new file mode 100644 index 000000000..ba5f21186 --- /dev/null +++ b/stable/_static/img/icons/icon-events.svg @@ -0,0 +1 @@ +icon-events diff --git a/stable/_static/img/icons/icon-exclamation.svg b/stable/_static/img/icons/icon-exclamation.svg new file mode 100644 index 000000000..a7eb4b77a --- /dev/null +++ b/stable/_static/img/icons/icon-exclamation.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-expand.svg b/stable/_static/img/icons/icon-expand.svg new file mode 100644 index 000000000..380656536 --- /dev/null +++ b/stable/_static/img/icons/icon-expand.svg @@ -0,0 +1,50 @@ + + + + + + + + + diff --git a/stable/_static/img/icons/icon-forum.svg b/stable/_static/img/icons/icon-forum.svg new file mode 100644 index 000000000..37a709f7a --- /dev/null +++ b/stable/_static/img/icons/icon-forum.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-getting-started.svg b/stable/_static/img/icons/icon-getting-started.svg new file mode 100644 index 000000000..702500be4 --- /dev/null +++ b/stable/_static/img/icons/icon-getting-started.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-glossary.svg b/stable/_static/img/icons/icon-glossary.svg new file mode 100644 index 000000000..e8329c2af --- /dev/null +++ b/stable/_static/img/icons/icon-glossary.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-home.svg b/stable/_static/img/icons/icon-home.svg new file mode 100644 index 000000000..f0b9c2541 --- /dev/null +++ b/stable/_static/img/icons/icon-home.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-infoworld.svg b/stable/_static/img/icons/icon-infoworld.svg new file mode 100644 index 000000000..906e87279 --- /dev/null +++ b/stable/_static/img/icons/icon-infoworld.svg @@ -0,0 +1 @@ +icon-infoworld diff --git a/stable/_static/img/icons/icon-integrations.svg b/stable/_static/img/icons/icon-integrations.svg new file mode 100644 index 000000000..1ef0920d4 --- /dev/null +++ b/stable/_static/img/icons/icon-integrations.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-knowledge-base.svg b/stable/_static/img/icons/icon-knowledge-base.svg new file mode 100644 index 000000000..884451270 --- /dev/null +++ b/stable/_static/img/icons/icon-knowledge-base.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-less.svg b/stable/_static/img/icons/icon-less.svg new file mode 100644 index 000000000..3094127de --- /dev/null +++ b/stable/_static/img/icons/icon-less.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/stable/_static/img/icons/icon-live-test.svg b/stable/_static/img/icons/icon-live-test.svg new file mode 100644 index 000000000..dcb5916c2 --- /dev/null +++ b/stable/_static/img/icons/icon-live-test.svg @@ -0,0 +1 @@ +icon-live-test diff --git a/stable/_static/img/icons/icon-mail-list.svg b/stable/_static/img/icons/icon-mail-list.svg new file mode 100644 index 000000000..0e6192a35 --- /dev/null +++ b/stable/_static/img/icons/icon-mail-list.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-manager.svg b/stable/_static/img/icons/icon-manager.svg new file mode 100644 index 000000000..02b4e425b --- /dev/null +++ b/stable/_static/img/icons/icon-manager.svg @@ -0,0 +1 @@ +icon-manager diff --git a/stable/_static/img/icons/icon-memory-management.svg b/stable/_static/img/icons/icon-memory-management.svg new file mode 100644 index 000000000..e34eb4504 --- /dev/null +++ b/stable/_static/img/icons/icon-memory-management.svg @@ -0,0 +1 @@ +icon-memory-management diff --git a/stable/_static/img/icons/icon-modeling.svg b/stable/_static/img/icons/icon-modeling.svg new file mode 100644 index 000000000..97fa3a0e2 --- /dev/null +++ b/stable/_static/img/icons/icon-modeling.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-monitoring.svg b/stable/_static/img/icons/icon-monitoring.svg new file mode 100644 index 000000000..80b3787f6 --- /dev/null +++ b/stable/_static/img/icons/icon-monitoring.svg @@ -0,0 +1 @@ +icon-monitoring diff --git a/stable/_static/img/icons/icon-networking.svg b/stable/_static/img/icons/icon-networking.svg new file mode 100644 index 000000000..40a3fd5f6 --- /dev/null +++ b/stable/_static/img/icons/icon-networking.svg @@ -0,0 +1 @@ +icon-networking diff --git a/stable/_static/img/icons/icon-news.svg b/stable/_static/img/icons/icon-news.svg new file mode 100644 index 000000000..a952b5993 --- /dev/null +++ b/stable/_static/img/icons/icon-news.svg @@ -0,0 +1 @@ +icon-news diff --git a/stable/_static/img/icons/icon-newsletter.svg b/stable/_static/img/icons/icon-newsletter.svg new file mode 100644 index 000000000..5b8d47eb1 --- /dev/null +++ b/stable/_static/img/icons/icon-newsletter.svg @@ -0,0 +1 @@ +icon-newsletter diff --git a/stable/_static/img/icons/icon-nsql-guides.svg b/stable/_static/img/icons/icon-nsql-guides.svg new file mode 100644 index 000000000..60ebab379 --- /dev/null +++ b/stable/_static/img/icons/icon-nsql-guides.svg @@ -0,0 +1 @@ +icon-nsql-guides diff --git a/stable/_static/img/icons/icon-open-source.svg b/stable/_static/img/icons/icon-open-source.svg new file mode 100644 index 000000000..98c2ea7d5 --- /dev/null +++ b/stable/_static/img/icons/icon-open-source.svg @@ -0,0 +1 @@ +icon-open-source diff --git a/stable/_static/img/icons/icon-operator.svg b/stable/_static/img/icons/icon-operator.svg new file mode 100644 index 000000000..bb7d8d3ea --- /dev/null +++ b/stable/_static/img/icons/icon-operator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-overview.svg b/stable/_static/img/icons/icon-overview.svg new file mode 100644 index 000000000..515c1528a --- /dev/null +++ b/stable/_static/img/icons/icon-overview.svg @@ -0,0 +1 @@ +icon-overview diff --git a/stable/_static/img/icons/icon-partners.svg b/stable/_static/img/icons/icon-partners.svg new file mode 100644 index 000000000..d0146fc49 --- /dev/null +++ b/stable/_static/img/icons/icon-partners.svg @@ -0,0 +1 @@ +icon-partners diff --git a/stable/_static/img/icons/icon-plus.svg b/stable/_static/img/icons/icon-plus.svg new file mode 100644 index 000000000..575743508 --- /dev/null +++ b/stable/_static/img/icons/icon-plus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/stable/_static/img/icons/icon-pricing.svg b/stable/_static/img/icons/icon-pricing.svg new file mode 100644 index 000000000..74b01db16 --- /dev/null +++ b/stable/_static/img/icons/icon-pricing.svg @@ -0,0 +1 @@ +icon-pricing$ diff --git a/stable/_static/img/icons/icon-release-notes.svg b/stable/_static/img/icons/icon-release-notes.svg new file mode 100644 index 000000000..80c490c7b --- /dev/null +++ b/stable/_static/img/icons/icon-release-notes.svg @@ -0,0 +1 @@ +icon-release-notes diff --git a/stable/_static/img/icons/icon-resource-center.svg b/stable/_static/img/icons/icon-resource-center.svg new file mode 100644 index 000000000..6e3ab08e7 --- /dev/null +++ b/stable/_static/img/icons/icon-resource-center.svg @@ -0,0 +1 @@ +icon-ressource-center diff --git a/stable/_static/img/icons/icon-roadmap.svg b/stable/_static/img/icons/icon-roadmap.svg new file mode 100644 index 000000000..c8cbf67c8 --- /dev/null +++ b/stable/_static/img/icons/icon-roadmap.svg @@ -0,0 +1 @@ +icon-roadmap-4 diff --git a/stable/_static/img/icons/icon-search.svg b/stable/_static/img/icons/icon-search.svg new file mode 100644 index 000000000..81aae93ee --- /dev/null +++ b/stable/_static/img/icons/icon-search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/stable/_static/img/icons/icon-slack.svg b/stable/_static/img/icons/icon-slack.svg new file mode 100644 index 000000000..fc164ea1e --- /dev/null +++ b/stable/_static/img/icons/icon-slack.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-stack-overflow.svg b/stable/_static/img/icons/icon-stack-overflow.svg new file mode 100644 index 000000000..bebe9b827 --- /dev/null +++ b/stable/_static/img/icons/icon-stack-overflow.svg @@ -0,0 +1,4 @@ + + + + diff --git a/stable/_static/img/icons/icon-summit.svg b/stable/_static/img/icons/icon-summit.svg new file mode 100644 index 000000000..4b900bd0c --- /dev/null +++ b/stable/_static/img/icons/icon-summit.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/icons/icon-support.svg b/stable/_static/img/icons/icon-support.svg new file mode 100644 index 000000000..a4228b34e --- /dev/null +++ b/stable/_static/img/icons/icon-support.svg @@ -0,0 +1 @@ +icon-support diff --git a/stable/_static/img/icons/icon-tech-talks.svg b/stable/_static/img/icons/icon-tech-talks.svg new file mode 100644 index 000000000..df42b5522 --- /dev/null +++ b/stable/_static/img/icons/icon-tech-talks.svg @@ -0,0 +1 @@ +icon-tech-talks diff --git a/stable/_static/img/icons/icon-testing.svg b/stable/_static/img/icons/icon-testing.svg new file mode 100644 index 000000000..2fe54efdb --- /dev/null +++ b/stable/_static/img/icons/icon-testing.svg @@ -0,0 +1 @@ +icon-testing diff --git a/stable/_static/img/icons/icon-thumbs-down.svg b/stable/_static/img/icons/icon-thumbs-down.svg new file mode 100644 index 000000000..3e7bcd6d9 --- /dev/null +++ b/stable/_static/img/icons/icon-thumbs-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-thumbs-up.svg b/stable/_static/img/icons/icon-thumbs-up.svg new file mode 100644 index 000000000..226c44d85 --- /dev/null +++ b/stable/_static/img/icons/icon-thumbs-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/stable/_static/img/icons/icon-tip.svg b/stable/_static/img/icons/icon-tip.svg new file mode 100644 index 000000000..bf7aa6af8 --- /dev/null +++ b/stable/_static/img/icons/icon-tip.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/stable/_static/img/icons/icon-training.svg b/stable/_static/img/icons/icon-training.svg new file mode 100644 index 000000000..08b95a88e --- /dev/null +++ b/stable/_static/img/icons/icon-training.svg @@ -0,0 +1 @@ +icon-training diff --git a/stable/_static/img/icons/icon-triangle-down.svg b/stable/_static/img/icons/icon-triangle-down.svg new file mode 100644 index 000000000..e8ae08810 --- /dev/null +++ b/stable/_static/img/icons/icon-triangle-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/icons/icon-university.svg b/stable/_static/img/icons/icon-university.svg new file mode 100644 index 000000000..f7547ab95 --- /dev/null +++ b/stable/_static/img/icons/icon-university.svg @@ -0,0 +1 @@ +icon-university diff --git a/stable/_static/img/icons/icon-users-blog.svg b/stable/_static/img/icons/icon-users-blog.svg new file mode 100644 index 000000000..47e56cddc --- /dev/null +++ b/stable/_static/img/icons/icon-users-blog.svg @@ -0,0 +1 @@ +icon-users-blog diff --git a/stable/_static/img/icons/icon-warning.svg b/stable/_static/img/icons/icon-warning.svg new file mode 100644 index 000000000..e4b1d4033 --- /dev/null +++ b/stable/_static/img/icons/icon-warning.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/stable/_static/img/icons/icon-webinars.svg b/stable/_static/img/icons/icon-webinars.svg new file mode 100644 index 000000000..5e9f5cd42 --- /dev/null +++ b/stable/_static/img/icons/icon-webinars.svg @@ -0,0 +1 @@ +icon-webinars diff --git a/stable/_static/img/icons/icon-whitepapers.svg b/stable/_static/img/icons/icon-whitepapers.svg new file mode 100644 index 000000000..3351e51d2 --- /dev/null +++ b/stable/_static/img/icons/icon-whitepapers.svg @@ -0,0 +1 @@ +icon-whitepapers diff --git a/stable/_static/img/icons/icon-workshop.svg b/stable/_static/img/icons/icon-workshop.svg new file mode 100644 index 000000000..5206e58e9 --- /dev/null +++ b/stable/_static/img/icons/icon-workshop.svg @@ -0,0 +1 @@ + diff --git a/stable/_static/img/logo-docs.svg b/stable/_static/img/logo-docs.svg new file mode 100644 index 000000000..4fff669cb --- /dev/null +++ b/stable/_static/img/logo-docs.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stable/_static/img/logo-scylla-horizontal-RGB.svg b/stable/_static/img/logo-scylla-horizontal-RGB.svg new file mode 100644 index 000000000..b5022d7c4 --- /dev/null +++ b/stable/_static/img/logo-scylla-horizontal-RGB.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/stable/_static/img/mascots/404.jpg b/stable/_static/img/mascots/404.jpg new file mode 100644 index 000000000..769fa0889 Binary files /dev/null and b/stable/_static/img/mascots/404.jpg differ diff --git a/stable/_static/img/mascots/scylla-3monsters.png b/stable/_static/img/mascots/scylla-3monsters.png new file mode 100644 index 000000000..7c06d0167 Binary files /dev/null and b/stable/_static/img/mascots/scylla-3monsters.png differ diff --git a/stable/_static/img/mascots/scylla-advisor-crystal.png b/stable/_static/img/mascots/scylla-advisor-crystal.png new file mode 100644 index 000000000..d33fddd62 Binary files /dev/null and b/stable/_static/img/mascots/scylla-advisor-crystal.png differ diff --git a/stable/_static/img/mascots/scylla-alternator.svg b/stable/_static/img/mascots/scylla-alternator.svg new file mode 100644 index 000000000..0462f893d --- /dev/null +++ b/stable/_static/img/mascots/scylla-alternator.svg @@ -0,0 +1 @@ +scylla-alternator diff --git a/stable/_static/img/mascots/scylla-cloud.svg b/stable/_static/img/mascots/scylla-cloud.svg new file mode 100644 index 000000000..a6c6a26fc --- /dev/null +++ b/stable/_static/img/mascots/scylla-cloud.svg @@ -0,0 +1 @@ +scylla-cloud diff --git a/stable/_static/img/mascots/scylla-computer-3-monsters.png b/stable/_static/img/mascots/scylla-computer-3-monsters.png new file mode 100644 index 000000000..d0368a702 Binary files /dev/null and b/stable/_static/img/mascots/scylla-computer-3-monsters.png differ diff --git a/stable/_static/img/mascots/scylla-computer-headset.png b/stable/_static/img/mascots/scylla-computer-headset.png new file mode 100644 index 000000000..0cdadaa21 Binary files /dev/null and b/stable/_static/img/mascots/scylla-computer-headset.png differ diff --git a/stable/_static/img/mascots/scylla-cup-number-one.png b/stable/_static/img/mascots/scylla-cup-number-one.png new file mode 100644 index 000000000..e889f4e36 Binary files /dev/null and b/stable/_static/img/mascots/scylla-cup-number-one.png differ diff --git a/stable/_static/img/mascots/scylla-docs.svg b/stable/_static/img/mascots/scylla-docs.svg new file mode 100644 index 000000000..a5bce950c --- /dev/null +++ b/stable/_static/img/mascots/scylla-docs.svg @@ -0,0 +1 @@ +scylla-docs diff --git a/stable/_static/img/mascots/scylla-drivers.svg b/stable/_static/img/mascots/scylla-drivers.svg new file mode 100644 index 000000000..6012e7167 --- /dev/null +++ b/stable/_static/img/mascots/scylla-drivers.svg @@ -0,0 +1 @@ +scylla-manager diff --git a/stable/_static/img/mascots/scylla-enterprise.svg b/stable/_static/img/mascots/scylla-enterprise.svg new file mode 100644 index 000000000..a1aa0b46a --- /dev/null +++ b/stable/_static/img/mascots/scylla-enterprise.svg @@ -0,0 +1 @@ +scylla-enterprise diff --git a/stable/_static/img/mascots/scylla-forklift-boxes.png b/stable/_static/img/mascots/scylla-forklift-boxes.png new file mode 100644 index 000000000..f64c29e6c Binary files /dev/null and b/stable/_static/img/mascots/scylla-forklift-boxes.png differ diff --git a/stable/_static/img/mascots/scylla-forklift-migration.png b/stable/_static/img/mascots/scylla-forklift-migration.png new file mode 100644 index 000000000..d2f645c64 Binary files /dev/null and b/stable/_static/img/mascots/scylla-forklift-migration.png differ diff --git a/stable/_static/img/mascots/scylla-gear.png b/stable/_static/img/mascots/scylla-gear.png new file mode 100644 index 000000000..0f53b26af Binary files /dev/null and b/stable/_static/img/mascots/scylla-gear.png differ diff --git a/stable/_static/img/mascots/scylla-hardhat.png b/stable/_static/img/mascots/scylla-hardhat.png new file mode 100644 index 000000000..630f2d909 Binary files /dev/null and b/stable/_static/img/mascots/scylla-hardhat.png differ diff --git a/stable/_static/img/mascots/scylla-headband.png b/stable/_static/img/mascots/scylla-headband.png new file mode 100644 index 000000000..c87abe684 Binary files /dev/null and b/stable/_static/img/mascots/scylla-headband.png differ diff --git a/stable/_static/img/mascots/scylla-headset.png b/stable/_static/img/mascots/scylla-headset.png new file mode 100644 index 000000000..ba52cd223 Binary files /dev/null and b/stable/_static/img/mascots/scylla-headset.png differ diff --git a/stable/_static/img/mascots/scylla-hearts.png b/stable/_static/img/mascots/scylla-hearts.png new file mode 100644 index 000000000..cef08c865 Binary files /dev/null and b/stable/_static/img/mascots/scylla-hearts.png differ diff --git a/stable/_static/img/mascots/scylla-looking-down.png b/stable/_static/img/mascots/scylla-looking-down.png new file mode 100644 index 000000000..75cccbfdf Binary files /dev/null and b/stable/_static/img/mascots/scylla-looking-down.png differ diff --git a/stable/_static/img/mascots/scylla-looking-up.png b/stable/_static/img/mascots/scylla-looking-up.png new file mode 100644 index 000000000..6f10405f2 Binary files /dev/null and b/stable/_static/img/mascots/scylla-looking-up.png differ diff --git a/stable/_static/img/mascots/scylla-magnifying-glass-fronting.png b/stable/_static/img/mascots/scylla-magnifying-glass-fronting.png new file mode 100644 index 000000000..e368cae16 Binary files /dev/null and b/stable/_static/img/mascots/scylla-magnifying-glass-fronting.png differ diff --git a/stable/_static/img/mascots/scylla-magnifying-glass.png b/stable/_static/img/mascots/scylla-magnifying-glass.png new file mode 100644 index 000000000..74ad66950 Binary files /dev/null and b/stable/_static/img/mascots/scylla-magnifying-glass.png differ diff --git a/stable/_static/img/mascots/scylla-manager.svg b/stable/_static/img/mascots/scylla-manager.svg new file mode 100644 index 000000000..6ba9ed937 --- /dev/null +++ b/stable/_static/img/mascots/scylla-manager.svg @@ -0,0 +1 @@ +scylla-manager-2 diff --git a/stable/_static/img/mascots/scylla-monitor.svg b/stable/_static/img/mascots/scylla-monitor.svg new file mode 100644 index 000000000..48bec7dde --- /dev/null +++ b/stable/_static/img/mascots/scylla-monitor.svg @@ -0,0 +1 @@ +scylla-monitor diff --git a/stable/_static/img/mascots/scylla-movement-fast.png b/stable/_static/img/mascots/scylla-movement-fast.png new file mode 100644 index 000000000..956d1dd0e Binary files /dev/null and b/stable/_static/img/mascots/scylla-movement-fast.png differ diff --git a/stable/_static/img/mascots/scylla-movement.png b/stable/_static/img/mascots/scylla-movement.png new file mode 100644 index 000000000..7ee2b0433 Binary files /dev/null and b/stable/_static/img/mascots/scylla-movement.png differ diff --git a/stable/_static/img/mascots/scylla-onpremise.png b/stable/_static/img/mascots/scylla-onpremise.png new file mode 100644 index 000000000..3b2dc8f1a Binary files /dev/null and b/stable/_static/img/mascots/scylla-onpremise.png differ diff --git a/stable/_static/img/mascots/scylla-opensource.svg b/stable/_static/img/mascots/scylla-opensource.svg new file mode 100644 index 000000000..299e9cb99 --- /dev/null +++ b/stable/_static/img/mascots/scylla-opensource.svg @@ -0,0 +1 @@ +Plan de travail 1 diff --git a/stable/_static/img/mascots/scylla-operator.svg b/stable/_static/img/mascots/scylla-operator.svg new file mode 100644 index 000000000..655a450b2 --- /dev/null +++ b/stable/_static/img/mascots/scylla-operator.svg @@ -0,0 +1 @@ +scylla-operator diff --git a/stable/_static/img/mascots/scylla-plugin.png b/stable/_static/img/mascots/scylla-plugin.png new file mode 100644 index 000000000..b28dc857c Binary files /dev/null and b/stable/_static/img/mascots/scylla-plugin.png differ diff --git a/stable/_static/img/mascots/scylla-release-mascot.png b/stable/_static/img/mascots/scylla-release-mascot.png new file mode 100644 index 000000000..09342ac68 Binary files /dev/null and b/stable/_static/img/mascots/scylla-release-mascot.png differ diff --git a/stable/_static/img/mascots/scylla-repair.png b/stable/_static/img/mascots/scylla-repair.png new file mode 100644 index 000000000..9b4c613e7 Binary files /dev/null and b/stable/_static/img/mascots/scylla-repair.png differ diff --git a/stable/_static/img/mascots/scylla-server.png b/stable/_static/img/mascots/scylla-server.png new file mode 100644 index 000000000..96dc78529 Binary files /dev/null and b/stable/_static/img/mascots/scylla-server.png differ diff --git a/stable/_static/img/mascots/scylla-sleeping.png b/stable/_static/img/mascots/scylla-sleeping.png new file mode 100644 index 000000000..f88598e05 Binary files /dev/null and b/stable/_static/img/mascots/scylla-sleeping.png differ diff --git a/stable/_static/img/mascots/scylla-tall-measure.png b/stable/_static/img/mascots/scylla-tall-measure.png new file mode 100644 index 000000000..6f0ca146c Binary files /dev/null and b/stable/_static/img/mascots/scylla-tall-measure.png differ diff --git a/stable/_static/img/mascots/scylla-university.png b/stable/_static/img/mascots/scylla-university.png new file mode 100644 index 000000000..b3d062119 Binary files /dev/null and b/stable/_static/img/mascots/scylla-university.png differ diff --git a/stable/_static/img/mascots/scylla-weights.png b/stable/_static/img/mascots/scylla-weights.png new file mode 100644 index 000000000..b070bb022 Binary files /dev/null and b/stable/_static/img/mascots/scylla-weights.png differ diff --git a/stable/_static/img/mascots/scylla-window-cleaning.png b/stable/_static/img/mascots/scylla-window-cleaning.png new file mode 100644 index 000000000..6a8b16a6b Binary files /dev/null and b/stable/_static/img/mascots/scylla-window-cleaning.png differ diff --git a/stable/_static/img/mascots/scylla-with-computer-2.png b/stable/_static/img/mascots/scylla-with-computer-2.png new file mode 100644 index 000000000..f3b8b2984 Binary files /dev/null and b/stable/_static/img/mascots/scylla-with-computer-2.png differ diff --git a/stable/_static/img/mascots/scylla-with-computer.png b/stable/_static/img/mascots/scylla-with-computer.png new file mode 100644 index 000000000..b38a6fbbe Binary files /dev/null and b/stable/_static/img/mascots/scylla-with-computer.png differ diff --git a/stable/_static/img/mascots/scylla-with-linux.png b/stable/_static/img/mascots/scylla-with-linux.png new file mode 100644 index 000000000..954bf13bc Binary files /dev/null and b/stable/_static/img/mascots/scylla-with-linux.png differ diff --git a/stable/_static/img/mascots/scylla-writting.png b/stable/_static/img/mascots/scylla-writting.png new file mode 100644 index 000000000..d35a13d38 Binary files /dev/null and b/stable/_static/img/mascots/scylla-writting.png differ diff --git a/stable/_static/img/menu.svg b/stable/_static/img/menu.svg new file mode 100644 index 000000000..30ea1d901 --- /dev/null +++ b/stable/_static/img/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/stable/_static/img/scylla-monitor.png b/stable/_static/img/scylla-monitor.png new file mode 100644 index 000000000..ff0962c7a Binary files /dev/null and b/stable/_static/img/scylla-monitor.png differ diff --git a/stable/_static/js/main.bundle.js b/stable/_static/js/main.bundle.js new file mode 100644 index 000000000..190a41642 --- /dev/null +++ b/stable/_static/js/main.bundle.js @@ -0,0 +1,2 @@ +/*! For license information please see main.bundle.js.LICENSE.txt */ +(self.webpackChunksphinx_scylladb_theme=self.webpackChunksphinx_scylladb_theme||[]).push([[179],{277:(t,e,n)=>{var i;self,i=function(t){return function(){"use strict";var e={"./js/foundation.abide.js":function(t,e,n){n.r(e),n.d(e,{Abide:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};this.$element=t,this.options=o().extend(!0,{},d.defaults,this.$element.data(),e),this.isEnabled=!0,this.formnovalidate=null,this.className="Abide",this._init()}},{key:"_init",value:function(){var t=this;this.$inputs=o().merge(this.$element.find("input").not('[type="submit"]'),this.$element.find("textarea, select")),this.$submits=this.$element.find('[type="submit"]');var e=this.$element.find("[data-abide-error]");this.options.a11yAttributes&&(this.$inputs.each((function(e,n){return t.addA11yAttributes(o()(n))})),e.each((function(e,n){return t.addGlobalErrorA11yAttributes(o()(n))}))),this._events()}},{key:"_events",value:function(){var t=this;this.$element.off(".abide").on("reset.zf.abide",(function(){t.resetForm()})).on("submit.zf.abide",(function(){return t.validateForm()})),this.$submits.off("click.zf.abide keydown.zf.abide").on("click.zf.abide keydown.zf.abide",(function(e){e.key&&" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.formnovalidate=null!==e.target.getAttribute("formnovalidate"),t.$element.submit())})),"fieldChange"===this.options.validateOn&&this.$inputs.off("change.zf.abide").on("change.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.liveValidate&&this.$inputs.off("input.zf.abide").on("input.zf.abide",(function(e){t.validateInput(o()(e.target))})),this.options.validateOnBlur&&this.$inputs.off("blur.zf.abide").on("blur.zf.abide",(function(e){t.validateInput(o()(e.target))}))}},{key:"_reflow",value:function(){this._init()}},{key:"_validationIsDisabled",value:function(){return!1===this.isEnabled||("boolean"==typeof this.formnovalidate?this.formnovalidate:!!this.$submits.length&&null!==this.$submits[0].getAttribute("formnovalidate"))}},{key:"enableValidation",value:function(){this.isEnabled=!0}},{key:"disableValidation",value:function(){this.isEnabled=!1}},{key:"requiredCheck",value:function(t){if(!t.attr("required"))return!0;var e=!0;switch(t[0].type){case"checkbox":e=t[0].checked;break;case"select":case"select-one":case"select-multiple":var n=t.find("option:selected");n.length&&n.val()||(e=!1);break;default:t.val()&&t.val().length||(e=!1)}return e}},{key:"findFormError",value:function(t,e){var n=this,i=t.length?t[0].id:"",o=t.siblings(this.options.formErrorSelector);return o.length||(o=t.parent().find(this.options.formErrorSelector)),i&&(o=o.add(this.$element.find('[data-form-error-for="'.concat(i,'"]')))),e&&(o=o.not("[data-form-error-on]"),e.forEach((function(e){o=(o=o.add(t.siblings('[data-form-error-on="'.concat(e,'"]')))).add(n.$element.find('[data-form-error-for="'.concat(i,'"][data-form-error-on="').concat(e,'"]')))}))),o}},{key:"findLabel",value:function(t){var e=t[0].id,n=this.$element.find('label[for="'.concat(e,'"]'));return n.length?n:t.closest("label")}},{key:"findRadioLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"findCheckboxLabels",value:function(t){var e=this,n=t.map((function(t,n){var i=n.id,r=e.$element.find('label[for="'.concat(i,'"]'));return r.length||(r=o()(n).closest("label")),r[0]}));return o()(n)}},{key:"addErrorClasses",value:function(t,e){var n=this.findLabel(t),i=this.findFormError(t,e);n.length&&n.addClass(this.options.labelErrorClass),i.length&&i.addClass(this.options.formErrorClass),t.addClass(this.options.inputErrorClass).attr({"data-invalid":"","aria-invalid":!0}),i.filter(":visible").length&&this.addA11yErrorDescribe(t,i)}},{key:"addA11yAttributes",value:function(t){var e=this.findFormError(t),n=e.filter("label");if(e.length){var i=e.filter(":visible").first();if(i.length&&this.addA11yErrorDescribe(t,i),n.filter("[for]").length=s&&(i=!0)),!0!==this.initialized&&s>1||(n.each((function(t,n){i?e.removeErrorClasses(o()(n)):e.addErrorClasses(o()(n),["required"])})),i)}},{key:"matchValidation",value:function(t,e,n){var i=this;return n=!!n,-1===e.split(" ").map((function(e){return i.options.validators[e](t,n,t.parent())})).indexOf(!1)}},{key:"resetForm",value:function(){var t=this.$element,e=this.options;o()(".".concat(e.labelErrorClass),t).not("small").removeClass(e.labelErrorClass),o()(".".concat(e.inputErrorClass),t).not("small").removeClass(e.inputErrorClass),o()("".concat(e.formErrorSelector,".").concat(e.formErrorClass)).removeClass(e.formErrorClass),t.find("[data-abide-error]").css("display","none"),o()(":input",t).not(":button, :submit, :reset, :hidden, :radio, :checkbox, [data-abide-ignore]").val("").attr({"data-invalid":null,"aria-invalid":null}),o()(":input:radio",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),o()(":input:checkbox",t).not("[data-abide-ignore]").prop("checked",!1).attr({"data-invalid":null,"aria-invalid":null}),t.trigger("formreset.zf.abide",[t])}},{key:"_destroy",value:function(){var t=this;this.$element.off(".abide").find("[data-abide-error]").css("display","none"),this.$inputs.off(".abide").each((function(){t.removeErrorClasses(o()(this))})),this.$submits.off(".abide")}}],n&&l(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),d}(r.Plugin);f.defaults={validateOn:"fieldChange",labelErrorClass:"is-invalid-label",inputErrorClass:"is-invalid-input",formErrorSelector:".form-error",formErrorClass:"is-visible",a11yAttributes:!0,a11yErrorLevel:"assertive",liveValidate:!1,validateOnBlur:!1,patterns:{alpha:/^[a-zA-Z]+$/,alpha_numeric:/^[a-zA-Z0-9]+$/,integer:/^[-+]?\d+$/,number:/^[-+]?\d*(?:[\.\,]\d+)?$/,card:/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(?:222[1-9]|2[3-6][0-9]{2}|27[0-1][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$/,cvv:/^([0-9]){3,4}$/,email:/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/,url:/^((?:(https?|ftps?|file|ssh|sftp):\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?\xab\xbb\u201c\u201d\u2018\u2019]))$/,domain:/^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,8}$/,datetime:/^([0-2][0-9]{3})\-([0-1][0-9])\-([0-3][0-9])T([0-5][0-9])\:([0-5][0-9])\:([0-5][0-9])(Z|([\-\+]([0-1][0-9])\:00))$/,date:/(?:19|20)[0-9]{2}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))$/,time:/^(0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9]){2}$/,dateISO:/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/,month_day_year:/^(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.]\d{4}$/,day_month_year:/^(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.]\d{4}$/,color:/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,website:{test:function(t){return f.defaults.patterns.domain.test(t)||f.defaults.patterns.url.test(t)}}},validators:{equalTo:function(t){return o()("#".concat(t.attr("data-equalto"))).val()===t.val()}}}},"./js/foundation.accordion.js":function(t,e,n){n.r(e),n.d(e,{Accordion:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n'),t.options.submenuToggle?(n.addClass("has-submenu-toggle"),n.children("a").after('")):n.attr({"aria-controls":r,"aria-expanded":s,id:e}),i.attr({"aria-labelledby":e,"aria-hidden":!s,role:"group",id:r})}));var e=this.$element.find(".is-active");e.length&&e.each((function(){t.down(o()(this))})),this._events()}},{key:"_events",value:function(){var t=this;this.$element.find("li").each((function(){var e=o()(this).children("[data-submenu]");e.length&&(t.options.submenuToggle?o()(this).children(".submenu-toggle").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(){t.toggle(e)})):o()(this).children("a").off("click.zf.accordionMenu").on("click.zf.accordionMenu",(function(n){n.preventDefault(),t.toggle(e)})))})).on("keydown.zf.accordionMenu",(function(e){var n,i,s=o()(this),a=s.parent("ul").children("li"),l=s.children("[data-submenu]");a.each((function(t){if(o()(this).is(s))return n=a.eq(Math.max(0,t-1)).find("a").first(),i=a.eq(Math.min(t+1,a.length-1)).find("a").first(),o()(this).children("[data-submenu]:visible").length&&(i=s.find("li:first-child").find("a").first()),o()(this).is(":first-child")?n=s.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(o()(this).is(":last-child")&&(i=s.parents("li").first().next("li").find("a").first()))})),r.Keyboard.handleKey(e,"AccordionMenu",{open:function(){l.is(":hidden")&&(t.down(l),l.find("li").first().find("a").first().focus())},close:function(){l.length&&!l.is(":hidden")?t.up(l):s.parent("[data-submenu]").length&&(t.up(s.parent("[data-submenu]")),s.parents("li").first().find("a").first().focus())},up:function(){return n.focus(),!0},down:function(){return i.focus(),!0},toggle:function(){return!t.options.submenuToggle&&(s.children("[data-submenu]").length?(t.toggle(s.children("[data-submenu]")),!0):void 0)},closeAll:function(){t.hideAll()},handled:function(t){t&&e.preventDefault()}})}))}},{key:"hideAll",value:function(){this.up(this.$element.find("[data-submenu]"))}},{key:"showAll",value:function(){this.down(this.$element.find("[data-submenu]"))}},{key:"toggle",value:function(t){t.is(":animated")||(t.is(":hidden")?this.down(t):this.up(t))}},{key:"down",value:function(t){var e=this;if(!this.options.multiOpen){var n=t.parentsUntil(this.$element).add(t).add(t.find(".is-active")),i=this.$element.find(".is-active").not(n);this.up(i)}t.addClass("is-active").attr({"aria-hidden":!1}),this.options.submenuToggle?t.prev(".submenu-toggle").attr({"aria-expanded":!0}):t.parent(".is-accordion-submenu-parent").attr({"aria-expanded":!0}),t.slideDown(this.options.slideSpeed,(function(){e.$element.trigger("down.zf.accordionMenu",[t])}))}},{key:"up",value:function(t){var e=this,n=t.find("[data-submenu]"),i=t.add(n);n.slideUp(0),i.removeClass("is-active").attr("aria-hidden",!0),this.options.submenuToggle?i.prev(".submenu-toggle").attr("aria-expanded",!1):i.parent(".is-accordion-submenu-parent").attr("aria-expanded",!1),t.slideUp(this.options.slideSpeed,(function(){e.$element.trigger("up.zf.accordionMenu",[t])}))}},{key:"_destroy",value:function(){this.$element.find("[data-submenu]").slideDown(0).css("display",""),this.$element.find("a").off("click.zf.accordionMenu"),this.$element.find("[data-is-parent-link]").detach(),this.options.submenuToggle&&(this.$element.find(".has-submenu-toggle").removeClass("has-submenu-toggle"),this.$element.find(".submenu-toggle").remove()),s.Nest.Burn(this.$element,"accordion")}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(n("./js/foundation.core.plugin.js").Plugin);d.defaults={parentLink:!1,slideSpeed:250,submenuToggle:!1,submenuToggleText:"Toggle menu",multiOpen:!0}},"./js/foundation.core.js":function(t,e,n){n.r(e),n.d(e,{Foundation:function(){return l}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.mediaQuery.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l={version:"6.8.1",_plugins:{},_uuids:[],plugin:function(t,e){var n=e||u(t),i=c(n);this._plugins[i]=this[n]=t},registerPlugin:function(t,e){var n=e?c(e):u(t.constructor).toLowerCase();t.uuid=(0,r.GetYoDigits)(6,n),t.$element.attr("data-".concat(n))||t.$element.attr("data-".concat(n),t.uuid),t.$element.data("zfPlugin")||t.$element.data("zfPlugin",t),t.$element.trigger("init.zf.".concat(n)),this._uuids.push(t.uuid)},unregisterPlugin:function(t){var e=c(u(t.$element.data("zfPlugin").constructor));for(var n in this._uuids.splice(this._uuids.indexOf(t.uuid),1),t.$element.removeAttr("data-".concat(e)).removeData("zfPlugin").trigger("destroyed.zf.".concat(e)),t)"function"==typeof t[n]&&(t[n]=null)},reInit:function(t){var e=t instanceof o();try{if(e)t.each((function(){o()(this).data("zfPlugin")._init()}));else{var n=a(t),i=this;({object:function(t){t.forEach((function(t){t=c(t),o()("[data-"+t+"]").foundation("_init")}))},string:function(){t=c(t),o()("[data-"+t+"]").foundation("_init")},undefined:function(){this.object(Object.keys(i._plugins))}})[n](t)}}catch(t){console.error(t)}finally{return t}},reflow:function(t,e){void 0===e?e=Object.keys(this._plugins):"string"==typeof e&&(e=[e]);var n=this;o().each(e,(function(e,i){var r=n._plugins[i];o()(t).find("[data-"+i+"]").addBack("[data-"+i+"]").filter((function(){return void 0===o()(this).data("zfPlugin")})).each((function(){var t=o()(this),e={reflow:!0};t.attr("data-options")&&t.attr("data-options").split(";").forEach((function(t){var n,i=t.split(":").map((function(t){return t.trim()}));i[0]&&(e[i[0]]="true"===(n=i[1])||"false"!==n&&(isNaN(1*n)?n:parseFloat(n)))}));try{t.data("zfPlugin",new r(o()(this),e))}catch(t){console.error(t)}finally{return}}))}))},getFnName:u,addToJquery:function(){return o().fn.foundation=function(t){var e=a(t),n=o()(".no-js");if(n.length&&n.removeClass("no-js"),"undefined"===e)s.MediaQuery._init(),l.reflow(this);else{if("string"!==e)throw new TypeError("We're sorry, ".concat(e," is not a valid parameter. You must use a string representing the method you wish to invoke."));var i=Array.prototype.slice.call(arguments,1),r=this.data("zfPlugin");if(void 0===r||void 0===r[t])throw new ReferenceError("We're sorry, '"+t+"' is not an available method for "+(r?u(r):"this element")+".");1===this.length?r[t].apply(r,i):this.each((function(e,n){r[t].apply(o()(n).data("zfPlugin"),i)}))}return this},o()}};function u(t){if(void 0===Function.prototype.name){var e=/function\s([^(]{1,})\(/.exec(t.toString());return e&&e.length>1?e[1].trim():""}return void 0===t.prototype?t.constructor.name:t.prototype.constructor.name}function c(t){return t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}l.util={throttle:function(t,e){var n=null;return function(){var i=this,o=arguments;null===n&&(n=setTimeout((function(){t.apply(i,o),n=null}),e))}}},window.Foundation=l,function(){Date.now&&window.Date.now||(window.Date.now=Date.now=function(){return(new Date).getTime()});for(var t=["webkit","moz"],e=0;e0&&void 0!==arguments[0]?arguments[0]:6,e=arguments.length>1?arguments[1]:void 0,n="",i="0123456789abcdefghijklmnopqrstuvwxyz",o=i.length,r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=e.ignoreLeaveWindow,i=void 0!==n&&n,r=e.ignoreReappear,s=void 0!==r&&r;return function(e){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a'),e.data("savedHref",e.attr("href")).removeAttr("href").attr("tabindex",0),e.children("[data-submenu]").attr({"aria-hidden":!0,tabindex:0,role:"group"}),t._events(e)})),this.$submenus.each((function(){var e=o()(this);if(!e.find(".js-drilldown-back").length)switch(t.options.backButtonPosition){case"bottom":e.append(t.options.backButton);break;case"top":e.prepend(t.options.backButton);break;default:console.error("Unsupported backButtonPosition value '"+t.options.backButtonPosition+"'")}t._back(e)})),this.$submenus.addClass("invisible"),this.options.autoHeight||this.$submenus.addClass("drilldown-submenu-cover-previous"),this.$element.parent().hasClass("is-drilldown")||(this.$wrapper=o()(this.options.wrapper).addClass("is-drilldown"),this.options.animateHeight&&this.$wrapper.addClass("animate-height"),this.$element.wrap(this.$wrapper)),this.$wrapper=this.$element.parent(),this.$wrapper.css(this._getMaxDims())}},{key:"_resize",value:function(){this.$wrapper.css({"max-width":"none","min-height":"none"}),this.$wrapper.css(this._getMaxDims())}},{key:"_events",value:function(t){var e=this;t.off("click.zf.drilldown").on("click.zf.drilldown",(function(n){if(o()(n.target).parentsUntil("ul","li").hasClass("is-drilldown-submenu-parent")&&n.preventDefault(),e._show(t.parent("li")),e.options.closeOnClick){var i=o()("body");i.off(".zf.drilldown").on("click.zf.drilldown",(function(t){t.target===e.$element[0]||o().contains(e.$element[0],t.target)||(t.preventDefault(),e._hideAll(),i.off(".zf.drilldown"))}))}}))}},{key:"_registerEvents",value:function(){this.options.scrollTop&&(this._bindHandler=this._scrollTop.bind(this),this.$element.on("open.zf.drilldown hide.zf.drilldown close.zf.drilldown closed.zf.drilldown",this._bindHandler)),this.$element.on("mutateme.zf.trigger",this._resize.bind(this))}},{key:"_scrollTop",value:function(){var t=this,e=""!==t.options.scrollTopElement?o()(t.options.scrollTopElement):t.$element,n=parseInt(e.offset().top+t.options.scrollTopOffset,10);o()("html, body").stop(!0).animate({scrollTop:n},t.options.animationDuration,t.options.animationEasing,(function(){this===o()("html")[0]&&t.$element.trigger("scrollme.zf.drilldown")}))}},{key:"_keyboardEvents",value:function(){var t=this;this.$menuItems.add(this.$element.find(".js-drilldown-back > a, .is-submenu-parent-item > a")).on("keydown.zf.drilldown",(function(e){var n,i,s=o()(this),l=s.parent("li").parent("ul").children("li").children("a");l.each((function(t){if(o()(this).is(s))return n=l.eq(Math.max(0,t-1)),void(i=l.eq(Math.min(t+1,l.length-1)))})),r.Keyboard.handleKey(e,"Drilldown",{next:function(){if(s.is(t.$submenuAnchors))return t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0},previous:function(){return t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0},up:function(){return n.focus(),!s.is(t.$element.find("> li:first-child > a"))},down:function(){return i.focus(),!s.is(t.$element.find("> li:last-child > a"))},close:function(){s.is(t.$element.find("> li > a"))||(t._hide(s.parent().parent()),s.parent().parent().siblings("a").focus())},open:function(){return(!t.options.parentLink||!s.attr("href"))&&(s.is(t.$menuItems)?s.is(t.$submenuAnchors)?(t._show(s.parent("li")),s.parent("li").one((0,a.transitionend)(s),(function(){s.parent("li").find("ul li a").not(".js-drilldown-back a").first().focus()})),!0):void 0:(t._hide(s.parent("li").parent("ul")),s.parent("li").parent("ul").one((0,a.transitionend)(s),(function(){setTimeout((function(){s.parent("li").parent("ul").parent("li").children("a").first().focus()}),1)})),!0))},handled:function(t){t&&e.preventDefault()}})}))}},{key:"_hideAll",value:function(){var t=this,e=this.$element.find(".is-drilldown-submenu.is-active");if(e.addClass("is-closing"),e.parent().closest("ul").removeClass("invisible"),this.options.autoHeight){var n=e.parent().closest("ul").data("calcHeight");this.$wrapper.css({height:n})}this.$element.trigger("close.zf.drilldown"),e.one((0,a.transitionend)(e),(function(){e.removeClass("is-active is-closing"),t.$element.trigger("closed.zf.drilldown")}))}},{key:"_back",value:function(t){var e=this;t.off("click.zf.drilldown"),t.children(".js-drilldown-back").on("click.zf.drilldown",(function(){e._hide(t);var n=t.parent("li").parent("ul").parent("li");n.length?e._show(n):e.$currentMenu=e.$element}))}},{key:"_menuLinkEvents",value:function(){var t=this;this.$menuItems.not(".is-drilldown-submenu-parent").off("click.zf.drilldown").on("click.zf.drilldown",(function(){setTimeout((function(){t._hideAll()}),0)}))}},{key:"_setShowSubMenuClasses",value:function(t,e){t.addClass("is-active").removeClass("invisible").attr("aria-hidden",!1),t.parent("li").attr("aria-expanded",!0),!0===e&&this.$element.trigger("open.zf.drilldown",[t])}},{key:"_setHideSubMenuClasses",value:function(t,e){t.removeClass("is-active").addClass("invisible").attr("aria-hidden",!0),t.parent("li").attr("aria-expanded",!1),!0===e&&t.trigger("hide.zf.drilldown",[t])}},{key:"_showMenu",value:function(t,e){var n=this;if(this.$element.find('li[aria-expanded="true"] > ul[data-submenu]').each((function(){n._setHideSubMenuClasses(o()(this))})),this.$currentMenu=t,t.is("[data-drilldown]"))return!0===e&&t.find("li > a").first().focus(),void(this.options.autoHeight&&this.$wrapper.css("height",t.data("calcHeight")));var i=t.children().first().parentsUntil("[data-drilldown]","[data-submenu]");i.each((function(r){0===r&&n.options.autoHeight&&n.$wrapper.css("height",o()(this).data("calcHeight"));var s=r===i.length-1;!0===s&&o()(this).one((0,a.transitionend)(o()(this)),(function(){!0===e&&t.find("li > a").first().focus()})),n._setShowSubMenuClasses(o()(this),s)}))}},{key:"_show",value:function(t){var e=t.children("[data-submenu]");t.attr("aria-expanded",!0),this.$currentMenu=e,t.parent().closest("ul").addClass("invisible"),e.addClass("is-active visible").removeClass("invisible").attr("aria-hidden",!1),this.options.autoHeight&&this.$wrapper.css({height:e.data("calcHeight")}),this.$element.trigger("open.zf.drilldown",[t])}},{key:"_hide",value:function(t){this.options.autoHeight&&this.$wrapper.css({height:t.parent().closest("ul").data("calcHeight")}),t.parent().closest("ul").removeClass("invisible"),t.parent("li").attr("aria-expanded",!1),t.attr("aria-hidden",!0),t.addClass("is-closing").one((0,a.transitionend)(t),(function(){t.removeClass("is-active is-closing visible"),t.blur().addClass("invisible")})),t.trigger("hide.zf.drilldown",[t])}},{key:"_getMaxDims",value:function(){var t=0,e={},n=this;return this.$submenus.add(this.$element).each((function(){var e=l.Box.GetDimensions(this).height;t=e>t?e:t,n.options.autoHeight&&o()(this).data("calcHeight",e)})),this.options.autoHeight?e.height=this.$currentMenu.data("calcHeight"):e["min-height"]="".concat(t,"px"),e["max-width"]="".concat(this.$element[0].getBoundingClientRect().width,"px"),e}},{key:"_destroy",value:function(){o()("body").off(".zf.drilldown"),this.options.scrollTop&&this.$element.off(".zf.drilldown",this._bindHandler),this._hideAll(),this.$element.off("mutateme.zf.trigger"),s.Nest.Burn(this.$element,"drilldown"),this.$element.unwrap().find(".js-drilldown-back, .is-submenu-parent-item").remove().end().find(".is-active, .is-closing, .is-drilldown-submenu").removeClass("is-active is-closing is-drilldown-submenu").off("transitionend otransitionend webkitTransitionEnd").end().find("[data-submenu]").removeAttr("aria-hidden tabindex role"),this.$submenuAnchors.each((function(){o()(this).off(".zf.drilldown")})),this.$element.find("[data-is-parent-link]").detach(),this.$submenus.removeClass("drilldown-submenu-cover-previous invisible"),this.$element.find("a").each((function(){var t=o()(this);t.removeAttr("tabindex"),t.data("savedHref")&&t.attr("href",t.data("savedHref")).removeData("savedHref")}))}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.core.plugin.js").Plugin);h.defaults={autoApplyClass:!0,backButton:'
                                • Back
                                • ',backButtonPosition:"top",wrapper:"
                                  ",parentLink:!1,closeOnClick:!1,autoHeight:!1,animateHeight:!1,scrollTop:!1,scrollTopElement:"",scrollTopOffset:0,animationDuration:500,animationEasing:"swing"}},"./js/foundation.dropdown.js":function(t,e,n){n.r(e),n.d(e,{Dropdown:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.positionable.js"),l=n("./js/foundation.util.triggers.js"),u=n("./js/foundation.util.touch.js");function c(t){return c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}function f(t,e){for(var n=0;n-1,l=s?t.$tabs:r.siblings("li").add(r);l.each((function(t){if(o()(this).is(r))return n=l.eq(t-1),void(i=l.eq(t+1))}));var u=function(){i.children("a:first").focus(),e.preventDefault()},c=function(){n.children("a:first").focus(),e.preventDefault()},f=function(){var n=r.children("ul.is-dropdown-submenu");n.length&&(t._show(n),r.find("li > a:first").focus(),e.preventDefault())},d=function(){var n=r.parent("ul").parent("li");n.children("a:first").focus(),t._hide(n),e.preventDefault()},h={open:f,close:function(){t._hide(t.$element),t.$menuItems.eq(0).children("a").focus(),e.preventDefault()}};s?t._isVertical()?t._isRtl()?o().extend(h,{down:u,up:c,next:d,previous:f}):o().extend(h,{down:u,up:c,next:f,previous:d}):t._isRtl()?o().extend(h,{next:c,previous:u,down:f,up:d}):o().extend(h,{next:u,previous:c,down:f,up:d}):t._isRtl()?o().extend(h,{next:d,previous:f,down:u,up:c}):o().extend(h,{next:f,previous:d,down:u,up:c}),a.Keyboard.handleKey(e,"DropdownMenu",h)}))}},{key:"_addBodyHandler",value:function(){var t=this,e=o()(document.body);this._removeBodyHandler(),e.on("click.zf.dropdownMenu tap.zf.dropdownMenu",(function(e){o()(e.target).closest(t.$element).length||(t._hide(),t._removeBodyHandler())}))}},{key:"_removeBodyHandler",value:function(){o()(document.body).off("click.zf.dropdownMenu tap.zf.dropdownMenu")}},{key:"_show",value:function(t){var e=this.$tabs.index(this.$tabs.filter((function(e,n){return o()(n).find(t).length>0}))),n=t.parent("li.is-dropdown-submenu-parent").siblings("li.is-dropdown-submenu-parent");this._hide(n,e),t.css("visibility","hidden").addClass("js-dropdown-active").parent("li.is-dropdown-submenu-parent").addClass("is-active");var i=u.Box.ImNotTouchingYou(t,null,!0);if(!i){var r="left"===this.options.alignment?"-right":"-left",s=t.parent(".is-dropdown-submenu-parent");s.removeClass("opens".concat(r)).addClass("opens-".concat(this.options.alignment)),(i=u.Box.ImNotTouchingYou(t,null,!0))||s.removeClass("opens-".concat(this.options.alignment)).addClass("opens-inner"),this.changed=!0}t.css("visibility",""),this.options.closeOnClick&&this._addBodyHandler(),this.$element.trigger("show.zf.dropdownMenu",[t])}},{key:"_hide",value:function(t,e){var n;if((n=t&&t.length?t:void 0!==e?this.$tabs.not((function(t){return t===e})):this.$element).hasClass("is-active")||n.find(".is-active").length>0){var i=n.find("li.is-active");if(i.add(n).attr({"data-is-click":!1}).removeClass("is-active"),n.find("ul.js-dropdown-active").removeClass("js-dropdown-active"),this.changed||n.find("opens-inner").length){var o="left"===this.options.alignment?"right":"left";n.find("li.is-dropdown-submenu-parent").add(n).removeClass("opens-inner opens-".concat(this.options.alignment)).addClass("opens-".concat(o)),this.changed=!1}clearTimeout(i.data("_delay")),this._removeBodyHandler(),this.$element.trigger("hide.zf.dropdownMenu",[n])}}},{key:"_destroy",value:function(){this.$menuItems.off(".zf.dropdownMenu").removeAttr("data-is-click").removeClass("is-right-arrow is-left-arrow is-down-arrow opens-right opens-left opens-inner"),o()(document.body).off(".zf.dropdownMenu"),l.Nest.Burn(this.$element,"dropdown")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),m}(r.Plugin);v.defaults={disableHover:!1,disableHoverOnTouch:!0,autoclose:!0,hoverDelay:50,clickOpen:!1,closingTime:500,alignment:"auto",closeOnClick:!0,closeOnClickInside:!0,verticalClass:"vertical",rightClass:"align-right",forceFollow:!0}},"./js/foundation.equalizer.js":function(t,e,n){n.r(e),n.d(e,{Equalizer:function(){return d}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.imageLoader.js"),a=n("./js/foundation.core.utils.js");function l(t){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},l(t)}function u(t,e){for(var n=0;n0,this.isNested=this.$element.parentsUntil(document.body,"[data-equalizer]").length>0,this.isOn=!1,this._bindHandler={onResizeMeBound:this._onResizeMe.bind(this),onPostEqualizedBound:this._onPostEqualized.bind(this)};var n,i=this.$element.find("img");this.options.equalizeOn?(n=this._checkMQ(),o()(window).on("changed.zf.mediaquery",this._checkMQ.bind(this))):this._events(),(void 0!==n&&!1===n||void 0===n)&&(i.length?(0,s.onImagesLoaded)(i,this._reflow.bind(this)):this._reflow())}},{key:"_pauseEvents",value:function(){this.isOn=!1,this.$element.off({".zf.equalizer":this._bindHandler.onPostEqualizedBound,"resizeme.zf.trigger":this._bindHandler.onResizeMeBound,"mutateme.zf.trigger":this._bindHandler.onResizeMeBound})}},{key:"_onResizeMe",value:function(){this._reflow()}},{key:"_onPostEqualized",value:function(t){t.target!==this.$element[0]&&this._reflow()}},{key:"_events",value:function(){this._pauseEvents(),this.hasNested?this.$element.on("postequalized.zf.equalizer",this._bindHandler.onPostEqualizedBound):(this.$element.on("resizeme.zf.trigger",this._bindHandler.onResizeMeBound),this.$element.on("mutateme.zf.trigger",this._bindHandler.onResizeMeBound)),this.isOn=!0}},{key:"_checkMQ",value:function(){var t=!r.MediaQuery.is(this.options.equalizeOn);return t?this.isOn&&(this._pauseEvents(),this.$watched.css("height","auto")):this.isOn||this._events(),t}},{key:"_killswitch",value:function(){}},{key:"_reflow",value:function(){if(!this.options.equalizeOnStack&&this._isStacked())return this.$watched.css("height","auto"),!1;this.options.equalizeByRow?this.getHeightsByRow(this.applyHeightByRow.bind(this)):this.getHeights(this.applyHeight.bind(this))}},{key:"_isStacked",value:function(){return!this.$watched[0]||!this.$watched[1]||this.$watched[0].getBoundingClientRect().top!==this.$watched[1].getBoundingClientRect().top}},{key:"getHeights",value:function(t){for(var e=[],n=0,i=this.$watched.length;nn;if(this.scrollPos=n,n0&&"push"===this.options.transition&&(this.options.contentScroll=!1);var r=this.$element.attr("class").match(/\bin-canvas-for-(\w+)/);r&&2===r.length?this.options.inCanvasOn=r[1]:this.options.inCanvasOn&&this.$element.addClass("in-canvas-for-".concat(this.options.inCanvasOn)),this.options.inCanvasOn&&this._checkInCanvas(),this._removeContentClasses()}},{key:"_events",value:function(){var t=this;this.$element.off(".zf.trigger .zf.offCanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offCanvas":this._handleKeyboard.bind(this)}),!0===this.options.closeOnClick&&(this.options.contentOverlay?this.$overlay:this.$content).on({"click.zf.offCanvas":this.close.bind(this)}),this.options.inCanvasOn&&o()(window).on("changed.zf.mediaquery",(function(){t._checkInCanvas()}))}},{key:"_setMQChecker",value:function(){var t=this;this.onLoadListener=(0,s.onLoad)(o()(window),(function(){l.MediaQuery.atLeast(t.options.revealOn)&&t.reveal(!0)})),o()(window).on("changed.zf.mediaquery",(function(){l.MediaQuery.atLeast(t.options.revealOn)?t.reveal(!0):t.reveal(!1)}))}},{key:"_checkInCanvas",value:function(){this.isInCanvas=l.MediaQuery.atLeast(this.options.inCanvasOn),!0===this.isInCanvas&&this.close()}},{key:"_removeContentClasses",value:function(t){"boolean"!=typeof t?this.$content.removeClass(this.contentClasses.base.join(" ")):!1===t&&this.$content.removeClass("has-reveal-".concat(this.position))}},{key:"_addContentClasses",value:function(t){this._removeContentClasses(t),"boolean"!=typeof t?this.$content.addClass("has-transition-".concat(this.options.transition," has-position-").concat(this.position)):!0===t&&this.$content.addClass("has-reveal-".concat(this.position))}},{key:"_fixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e);if("fixed"===n.css("position")){var i=parseInt(n.css("top"),10);n.data("offCanvasSticky",{top:i});var r=o()(document).scrollTop()+i;n.css({top:"".concat(r,"px"),width:"100%",transition:"none"})}}))}},{key:"_unfixStickyElements",value:function(){this.$sticky.each((function(t,e){var n=o()(e),i=n.data("offCanvasSticky");"object"===c(i)&&(n.css({top:"".concat(i.top,"px"),width:"",transition:""}),n.data("offCanvasSticky",""))}))}},{key:"reveal",value:function(t){t?(this.close(),this.isRevealed=!0,this.$element.attr("aria-hidden","false"),this.$element.off("open.zf.trigger toggle.zf.trigger"),this.$element.removeClass("is-closed")):(this.isRevealed=!1,this.$element.attr("aria-hidden","true"),this.$element.off("open.zf.trigger toggle.zf.trigger").on({"open.zf.trigger":this.open.bind(this),"toggle.zf.trigger":this.toggle.bind(this)}),this.$element.addClass("is-closed")),this._addContentClasses(t)}},{key:"_stopScrolling",value:function(){return!1}},{key:"_recordScrollable",value:function(t){this.lastY=t.touches[0].pageY}},{key:"_preventDefaultAtEdges",value:function(t){var e=this,n=t.data,i=e.lastY-t.touches[0].pageY;e.lastY=t.touches[0].pageY,n._canScroll(i,e)||t.preventDefault()}},{key:"_scrollboxTouchMoved",value:function(t){var e=this,n=t.data,i=e.closest("[data-off-canvas], [data-off-canvas-scrollbox-outer]"),o=e.lastY-t.touches[0].pageY;i.lastY=e.lastY=t.touches[0].pageY,t.stopPropagation(),n._canScroll(o,e)||(n._canScroll(o,i)?i.scrollTop+=o:t.preventDefault())}},{key:"_canScroll",value:function(t,e){var n=t<0,i=t>0,o=e.scrollTop>0,r=e.scrollTop1&&this.geoSync(),this.options.accessible&&this.$wrapper.attr("tabindex",0)}},{key:"_loadBullets",value:function(){this.$bullets=this.$element.find(".".concat(this.options.boxOfBullets)).find("button")}},{key:"geoSync",value:function(){var t=this;this.timer=new a.Timer(this.$element,{duration:this.options.timerDelay,infinite:!1},(function(){t.changeSlide(!0)})),this.timer.start()}},{key:"_prepareForOrbit",value:function(){this._setWrapperHeight()}},{key:"_setWrapperHeight",value:function(t){var e,n=0,i=0,r=this;this.$slides.each((function(){e=this.getBoundingClientRect().height,o()(this).attr("data-slide",i),/mui/g.test(o()(this)[0].className)||r.$slides.filter(".is-active")[0]===r.$slides.eq(i)[0]||o()(this).css({display:"none"}),n=e>n?e:n,i++})),i===this.$slides.length&&(this.$wrapper.css({height:n}),t&&t(n))}},{key:"_setSlideHeight",value:function(t){this.$slides.each((function(){o()(this).css("max-height",t)}))}},{key:"_events",value:function(){var t=this;this.$element.off(".resizeme.zf.trigger").on({"resizeme.zf.trigger":this._prepareForOrbit.bind(this)}),this.$slides.length>1&&(this.options.swipe&&this.$slides.off("swipeleft.zf.orbit swiperight.zf.orbit").on("swipeleft.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!0)})).on("swiperight.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(!1)})),this.options.autoPlay&&(this.$slides.on("click.zf.orbit",(function(){t.$element.data("clickedOn",!t.$element.data("clickedOn")),t.timer[t.$element.data("clickedOn")?"pause":"start"]()})),this.options.pauseOnHover&&this.$element.on("mouseenter.zf.orbit",(function(){t.timer.pause()})).on("mouseleave.zf.orbit",(function(){t.$element.data("clickedOn")||t.timer.start()}))),this.options.navButtons&&this.$element.find(".".concat(this.options.nextClass,", .").concat(this.options.prevClass)).attr("tabindex",0).on("click.zf.orbit touchend.zf.orbit",(function(e){e.preventDefault(),t.changeSlide(o()(this).hasClass(t.options.nextClass))})),this.options.bullets&&this.$bullets.on("click.zf.orbit touchend.zf.orbit",(function(){if(/is-active/g.test(this.className))return!1;var e=o()(this).data("slide"),n=e>t.$slides.filter(".is-active").data("slide"),i=t.$slides.eq(e);t.changeSlide(n,i,e)})),this.options.accessible&&this.$wrapper.add(this.$bullets).on("keydown.zf.orbit",(function(e){r.Keyboard.handleKey(e,"Orbit",{next:function(){t.changeSlide(!0)},previous:function(){t.changeSlide(!1)},handled:function(){o()(e.target).is(t.$bullets)&&t.$bullets.filter(".is-active").focus()}})})))}},{key:"_reset",value:function(){void 0!==this.$slides&&this.$slides.length>1&&(this.$element.off(".zf.orbit").find("*").off(".zf.orbit"),this.options.autoPlay&&this.timer.restart(),this.$slides.each((function(t){o()(t).removeClass("is-active is-active is-in").removeAttr("aria-live").hide()})),this.$slides.first().addClass("is-active").show(),this.$element.trigger("slidechange.zf.orbit",[this.$slides.first()]),this.options.bullets&&this._updateBullets(0))}},{key:"changeSlide",value:function(t,e,n){if(this.$slides){var i=this.$slides.filter(".is-active").eq(0);if(/mui/g.test(i[0].className))return!1;var o,r=this.$slides.first(),a=this.$slides.last(),l=t?"Right":"Left",u=t?"Left":"Right",c=this;(o=e||(t?this.options.infiniteWrap?i.next(".".concat(this.options.slideClass)).length?i.next(".".concat(this.options.slideClass)):r:i.next(".".concat(this.options.slideClass)):this.options.infiniteWrap?i.prev(".".concat(this.options.slideClass)).length?i.prev(".".concat(this.options.slideClass)):a:i.prev(".".concat(this.options.slideClass)))).length&&(this.$element.trigger("beforeslidechange.zf.orbit",[i,o]),this.options.bullets&&(n=n||this.$slides.index(o),this._updateBullets(n)),this.options.useMUI&&!this.$element.is(":hidden")?(s.Motion.animateIn(o.addClass("is-active"),this.options["animInFrom".concat(l)],(function(){o.css({display:"block"}).attr("aria-live","polite")})),s.Motion.animateOut(i.removeClass("is-active"),this.options["animOutTo".concat(u)],(function(){i.removeAttr("aria-live"),c.options.autoPlay&&!c.timer.isPaused&&c.timer.restart()}))):(i.removeClass("is-active is-in").removeAttr("aria-live").hide(),o.addClass("is-active is-in").attr("aria-live","polite").show(),this.options.autoPlay&&!this.timer.isPaused&&this.timer.restart()),this.$element.trigger("slidechange.zf.orbit",[o]))}}},{key:"_updateBullets",value:function(t){var e=this.$bullets.filter(".is-active"),n=this.$bullets.not(".is-active"),i=this.$bullets.eq(t);e.removeClass("is-active").blur(),i.addClass("is-active");var r=e.children("[data-slide-active-label]").last();if(!r.length){var s=e.children("span");n.toArray().map((function(t){return o()(t).children("span").length})).every((function(t){return t1?i[0]:"small",a=i.length>1?i[1]:i[0];null!==v[a]&&(t[s]=v[a])}this.rules=t}this._getAllOptions(),o().isEmptyObject(this.rules)||this._checkMediaQueries()}},{key:"_getAllOptions",value:function(){var t=this;for(var e in t.allOptions={},v)if(v.hasOwnProperty(e)){var n=v[e];try{var i=o()("
                                    "),r=new n.plugin(i,t.options);for(var s in r.options)if(r.options.hasOwnProperty(s)&&"zfPlugin"!==s){var a=r.options[s];t.allOptions[s]=a}r.destroy()}catch(t){console.warn("Warning: Problems getting Accordion/Tab options: ".concat(t))}}}},{key:"_events",value:function(){this._changedZfMediaQueryHandler=this._checkMediaQueries.bind(this),o()(window).on("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&(!this.currentPlugin.$element.data("zfPlugin")&&this.storezfData&&this.currentPlugin.$element.data("zfPlugin",this.storezfData),this.currentPlugin.destroy()),this._handleMarkup(this.rules[t].cssClass),this.currentRule=this.rules[t],this.currentPlugin=new this.currentRule.plugin(this.$element,this.options),this.storezfData=this.currentPlugin.$element.data("zfPlugin")))}},{key:"_handleMarkup",value:function(t){var e=this,n="accordion",i=o()("[data-tabs-content="+this.$element.attr("id")+"]");if(i.length&&(n="tabs"),n!==t){var r=e.allOptions.linkClass?e.allOptions.linkClass:"tabs-title",a=e.allOptions.panelClass?e.allOptions.panelClass:"tabs-panel";this.$element.removeAttr("role");var l=this.$element.children("."+r+",[data-accordion-item]").removeClass(r).removeClass("accordion-item").removeAttr("data-accordion-item"),u=l.children("a").removeClass("accordion-title");if("tabs"===n?(i=i.children("."+a).removeClass(a).removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby")).children("a").removeAttr("role").removeAttr("aria-controls").removeAttr("aria-selected"):i=l.children("[data-tab-content]").removeClass("accordion-content"),i.css({display:"",visibility:""}),l.css({display:"",visibility:""}),"accordion"===t)i.each((function(t,n){o()(n).appendTo(l.get(t)).addClass("accordion-content").attr("data-tab-content","").removeClass("is-active").css({height:""}),o()("[data-tabs-content="+e.$element.attr("id")+"]").after('
                                    ').detach(),l.addClass("accordion-item").attr("data-accordion-item",""),u.addClass("accordion-title")}));else if("tabs"===t){var c=o()("[data-tabs-content="+e.$element.attr("id")+"]"),f=o()("#tabs-placeholder-"+e.$element.attr("id"));f.length?(c=o()('
                                    ').insertAfter(f).attr("data-tabs-content",e.$element.attr("id")),f.remove()):c=o()('
                                    ').insertAfter(e.$element).attr("data-tabs-content",e.$element.attr("id")),i.each((function(t,e){var n=o()(e).appendTo(c).addClass(a),i=u.get(t).hash.slice(1),r=o()(e).attr("id")||(0,s.GetYoDigits)(6,"accordion");i!==r&&(""!==i?o()(e).attr("id",i):(i=r,o()(e).attr("id",i),o()(u.get(t)).attr("href",o()(u.get(t)).attr("href").replace("#","")+"#"+i))),o()(l.get(t)).hasClass("is-active")&&n.addClass("is-active")})),l.addClass(r)}}}},{key:"open",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.open)return(t=this.currentRule).open.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"close",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.close)return(t=this.currentRule).close.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"toggle",value:function(){var t;if(this.currentRule&&"function"==typeof this.currentRule.toggle)return(t=this.currentRule).toggle.apply(t,[this.currentPlugin].concat(Array.prototype.slice.call(arguments)))}},{key:"_destroy",value:function(){this.currentPlugin&&this.currentPlugin.destroy(),o()(window).off("changed.zf.mediaquery",this._changedZfMediaQueryHandler)}}],n&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveMenu.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveMenu:function(){return m}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.core.plugin.js"),l=n("./js/foundation.dropdownMenu.js"),u=n("./js/foundation.drilldown.js"),c=n("./js/foundation.accordionMenu.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?i[0]:"small",l=i.length>1?i[1]:i[0];null!==v[l]&&(t[a]=v[l])}this.rules=t}o().isEmptyObject(this.rules)||this._checkMediaQueries(),this.$element.attr("data-mutate",this.$element.attr("data-mutate")||(0,s.GetYoDigits)(6,"responsive-menu"))}},{key:"_events",value:function(){var t=this;o()(window).on("changed.zf.mediaquery",(function(){t._checkMediaQueries()}))}},{key:"_checkMediaQueries",value:function(){var t,e=this;o().each(this.rules,(function(e){r.MediaQuery.atLeast(e)&&(t=e)})),t&&(this.currentPlugin instanceof this.rules[t].plugin||(o().each(v,(function(t,n){e.$element.removeClass(n.cssClass)})),this.$element.addClass(this.rules[t].cssClass),this.currentPlugin&&this.currentPlugin.destroy(),this.currentPlugin=new this.rules[t].plugin(this.$element,{})))}},{key:"_destroy",value:function(){this.currentPlugin.destroy(),o()(window).off(".zf.ResponsiveMenu")}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),u}(a.Plugin);m.defaults={}},"./js/foundation.responsiveToggle.js":function(t,e,n){n.r(e),n.d(e,{ResponsiveToggle:function(){return f}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.mediaQuery.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}function l(t,e){for(var n=0;n").addClass("reveal-overlay"+t).appendTo(this.options.appendTo)}},{key:"_updatePosition",value:function(){var t,e=this.$element.outerWidth(),n=o()(window).width(),i=this.$element.outerHeight(),r=o()(window).height(),s=null;t="auto"===this.options.hOffset?parseInt((n-e)/2,10):parseInt(this.options.hOffset,10),"auto"===this.options.vOffset?s=i>r?parseInt(Math.min(100,r/10),10):parseInt((r-i)/4,10):null!==this.options.vOffset&&(s=parseInt(this.options.vOffset,10)),null!==s&&this.$element.css({top:s+"px"}),this.$overlay&&"auto"===this.options.hOffset||(this.$element.css({left:t+"px"}),this.$element.css({margin:"0px"}))}},{key:"_events",value:function(){var t=this,e=this;this.$element.on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":function(n,i){if(n.target===e.$element[0]||o()(n.target).parents("[data-closable]")[0]===i)return t.close.apply(t)},"toggle.zf.trigger":this.toggle.bind(this),"resizeme.zf.trigger":function(){e._updatePosition()}}),this.options.closeOnClick&&this.options.overlay&&this.$overlay.off(".zf.reveal").on("click.zf.dropdown tap.zf.dropdown",(function(t){t.target!==e.$element[0]&&!o().contains(e.$element[0],t.target)&&o().contains(document,t.target)&&e.close()})),this.options.deepLink&&o()(window).on("hashchange.zf.reveal:".concat(this.id),this._handleState.bind(this))}},{key:"_handleState",value:function(){window.location.hash!=="#"+this.id||this.isActive?this.close():this.open()}},{key:"_disableScroll",value:function(t){t=t||o()(window).scrollTop(),o()(document).height()>o()(window).height()&&o()("html").css("top",-t)}},{key:"_enableScroll",value:function(t){t=t||parseInt(o()("html").css("top"),10),o()(document).height()>o()(window).height()&&(o()("html").css("top",""),o()(window).scrollTop(-t))}},{key:"open",value:function(){var t=this,e="#".concat(this.id);this.options.deepLink&&window.location.hash!==e&&(window.history.pushState?this.options.updateHistory?window.history.pushState({},"",e):window.history.replaceState({},"",e):window.location.hash=e),this.$activeAnchor=o()(document.activeElement).is(this.$anchor)?o()(document.activeElement):this.$anchor,this.isActive=!0,this.$element.css({visibility:"hidden"}).show().scrollTop(0),this.options.overlay&&this.$overlay.css({visibility:"hidden"}).show(),this._updatePosition(),this.$element.hide().css({visibility:""}),this.$overlay&&(this.$overlay.css({visibility:""}).hide(),this.$element.hasClass("fast")?this.$overlay.addClass("fast"):this.$element.hasClass("slow")&&this.$overlay.addClass("slow")),this.options.multipleOpened||this.$element.trigger("closeme.zf.reveal",this.id),0===o()(".reveal:visible").length&&this._disableScroll();var n=this;this.options.animationIn?(this.options.overlay&&u.Motion.animateIn(this.$overlay,"fade-in"),u.Motion.animateIn(this.$element,this.options.animationIn,(function(){t.$element&&(t.focusableElements=a.Keyboard.findFocusable(t.$element),n.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),n._addGlobalClasses(),a.Keyboard.trapFocus(n.$element))}))):(this.options.overlay&&this.$overlay.show(0),this.$element.show(this.options.showDelay)),this.$element.attr({"aria-hidden":!1,tabindex:-1}).focus(),a.Keyboard.trapFocus(this.$element),this._addGlobalClasses(),this._addGlobalListeners(),this.$element.trigger("open.zf.reveal")}},{key:"_addGlobalClasses",value:function(){var t=function(){o()("html").toggleClass("zf-has-scroll",!!(o()(document).height()>o()(window).height()))};this.$element.on("resizeme.zf.trigger.revealScrollbarListener",(function(){return t()})),t(),o()("html").addClass("is-reveal-open")}},{key:"_removeGlobalClasses",value:function(){this.$element.off("resizeme.zf.trigger.revealScrollbarListener"),o()("html").removeClass("is-reveal-open"),o()("html").removeClass("zf-has-scroll")}},{key:"_addGlobalListeners",value:function(){var t=this;this.$element&&(this.focusableElements=a.Keyboard.findFocusable(this.$element),this.options.overlay||!this.options.closeOnClick||this.options.fullScreen||o()("body").on("click.zf.dropdown tap.zf.dropdown",(function(e){e.target!==t.$element[0]&&!o().contains(t.$element[0],e.target)&&o().contains(document,e.target)&&t.close()})),this.options.closeOnEsc&&o()(window).on("keydown.zf.reveal",(function(e){a.Keyboard.handleKey(e,"Reveal",{close:function(){t.options.closeOnEsc&&t.close()}})})))}},{key:"close",value:function(){if(!this.isActive||!this.$element.is(":visible"))return!1;var t=this;function e(){var e=parseInt(o()("html").css("top"),10);0===o()(".reveal:visible").length&&t._removeGlobalClasses(),a.Keyboard.releaseFocus(t.$element),t.$element.attr("aria-hidden",!0),0===o()(".reveal:visible").length&&t._enableScroll(e),t.$element.trigger("closed.zf.reveal")}if(this.options.animationOut?(this.options.overlay&&u.Motion.animateOut(this.$overlay,"fade-out"),u.Motion.animateOut(this.$element,this.options.animationOut,e)):(this.$element.hide(this.options.hideDelay),this.options.overlay?this.$overlay.hide(0,e):e()),this.options.closeOnEsc&&o()(window).off("keydown.zf.reveal"),!this.options.overlay&&this.options.closeOnClick&&o()("body").off("click.zf.dropdown tap.zf.dropdown"),this.$element.off("keydown.zf.reveal"),this.options.resetOnClose&&this.$element.html(this.$element.html()),this.isActive=!1,t.options.deepLink&&window.location.hash==="#".concat(this.id))if(window.history.replaceState){var n=window.location.pathname+window.location.search;this.options.updateHistory?window.history.pushState({},"",n):window.history.replaceState("",document.title,n)}else window.location.hash="";this.$activeAnchor.focus()}},{key:"toggle",value:function(){this.isActive?this.close():this.open()}},{key:"_destroy",value:function(){this.options.overlay&&(this.$element.appendTo(o()(this.options.appendTo)),this.$overlay.hide().off().remove()),this.$element.hide().off(),this.$anchor.off(".zf"),o()(window).off(".zf.reveal:".concat(this.id)),this.onLoadListener&&o()(window).off(this.onLoadListener),0===o()(".reveal:visible").length&&this._removeGlobalClasses()}}])&&h(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),g}(r.Plugin);m.defaults={animationIn:"",animationOut:"",showDelay:0,hideDelay:0,closeOnClick:!0,closeOnEsc:!0,multipleOpened:!1,vOffset:"auto",hOffset:"auto",fullScreen:!1,overlay:!0,resetOnClose:!1,deepLink:!1,updateHistory:!1,appendTo:"body",additionalOverlayClasses:""}},"./js/foundation.slider.js":function(t,e,n){n.r(e),n.d(e,{Slider:function(){return v}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.keyboard.js"),s=n("./js/foundation.util.motion.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.core.plugin.js"),u=n("./js/foundation.util.touch.js"),c=n("./js/foundation.util.triggers.js");function f(t){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f(t)}function d(t,e){for(var n=0;n1?this.inputs.eq(1):o()("#".concat(this.$handle2.attr("aria-controls"))),this.inputs[1]||(this.inputs=this.inputs.add(this.$input2)),this._setInitAttr(1)),this.setHandles(),this._events(),this.initialized=!0}},{key:"setHandles",value:function(){var t=this;this.handles[1]?this._setHandlePos(this.$handle,this.inputs.eq(0).val(),(function(){t._setHandlePos(t.$handle2,t.inputs.eq(1).val())})):this._setHandlePos(this.$handle,this.inputs.eq(0).val())}},{key:"_reflow",value:function(){this.setHandles()}},{key:"_pctOfBar",value:function(t){var e=m(t-this.options.start,this.options.end-this.options.start);switch(this.options.positionValueFunction){case"pow":e=this._logTransform(e);break;case"log":e=this._powTransform(e)}return e.toFixed(2)}},{key:"_value",value:function(t){switch(this.options.positionValueFunction){case"pow":t=this._powTransform(t);break;case"log":t=this._logTransform(t)}return this.options.vertical?parseFloat(this.options.end)+t*(this.options.start-this.options.end):(this.options.end-this.options.start)*t+parseFloat(this.options.start)}},{key:"_logTransform",value:function(t){return function(t,e){return Math.log(e)/Math.log(t)}(this.options.nonLinearBase,t*(this.options.nonLinearBase-1)+1)}},{key:"_powTransform",value:function(t){return(Math.pow(this.options.nonLinearBase,t)-1)/(this.options.nonLinearBase-1)}},{key:"_setHandlePos",value:function(t,e,n){if(!this.$element.hasClass(this.options.disabledClass)){(e=parseFloat(e))this.options.end&&(e=this.options.end);var i=this.options.doubleSided;if(i)if(0===this.handles.index(t)){var o=parseFloat(this.$handle2.attr("aria-valuenow"));e=e>=o?o-this.options.step:e}else{var r=parseFloat(this.$handle.attr("aria-valuenow"));e=e<=r?r+this.options.step:e}var a=this,l=this.options.vertical,u=l?"height":"width",c=l?"top":"left",f=t[0].getBoundingClientRect()[u],d=this.$element[0].getBoundingClientRect()[u],h=this._pctOfBar(e),p=(100*m((d-f)*h,d)).toFixed(this.options.decimal);e=parseFloat(e.toFixed(this.options.decimal));var v={};if(this._setValues(t,e),i){var g,y=0===this.handles.index(t),b=Math.floor(100*m(f,d));if(y)v[c]="".concat(p,"%"),g=parseFloat(this.$handle2[0].style[c])-p+b,n&&"function"==typeof n&&n();else{var w=parseFloat(this.$handle[0].style[c]);g=p-(isNaN(w)?(this.options.initialStart-this.options.start)/((this.options.end-this.options.start)/100):w)+b}v["min-".concat(u)]="".concat(g,"%")}var k=this.$element.data("dragging")?1e3/60:this.options.moveTime;(0,s.Move)(k,t,(function(){isNaN(p)?t.css(c,"".concat(100*h,"%")):t.css(c,"".concat(p,"%")),a.options.doubleSided?a.$fill.css(v):a.$fill.css(u,"".concat(100*h,"%"))})),this.initialized&&(this.$element.one("finished.zf.animate",(function(){a.$element.trigger("moved.zf.slider",[t])})),clearTimeout(a.timeout),a.timeout=setTimeout((function(){a.$element.trigger("changed.zf.slider",[t])}),a.options.changedDelay))}}},{key:"_setInitAttr",value:function(t){var e=0===t?this.options.initialStart:this.options.initialEnd,n=this.inputs.eq(t).attr("id")||(0,a.GetYoDigits)(6,"slider");this.inputs.eq(t).attr({id:n,max:this.options.end,min:this.options.start,step:this.options.step}),this.inputs.eq(t).val(e),this.handles.eq(t).attr({role:"slider","aria-controls":n,"aria-valuemax":this.options.end,"aria-valuemin":this.options.start,"aria-valuenow":e,"aria-orientation":this.options.vertical?"vertical":"horizontal",tabindex:0})}},{key:"_setValues",value:function(t,e){var n=this.options.doubleSided?this.handles.index(t):0;this.inputs.eq(n).val(e),t.attr("aria-valuenow",e)}},{key:"_handleEvent",value:function(t,e,n){var i;if(n)i=this._adjustValue(null,n);else{t.preventDefault();var r=this.options.vertical,s=r?"height":"width",l=r?"top":"left",u=r?t.pageY:t.pageX,c=this.$element[0].getBoundingClientRect()[s],f=r?o()(window).scrollTop():o()(window).scrollLeft(),d=this.$element.offset()[l];t.clientY===t.pageY&&(u+=f);var h,p=u-d,v=m(h=p<0?0:p>c?c:p,c);i=this._value(v),(0,a.rtl)()&&!this.options.vertical&&(i=this.options.end-i),i=this._adjustValue(null,i),e||(e=g(this.$handle,l,h,s)<=g(this.$handle2,l,h,s)?this.$handle:this.$handle2)}this._setHandlePos(e,i)}},{key:"_adjustValue",value:function(t,e){var n,i,o,r=this.options.step,s=parseFloat(r/2);return 0===(i=(n=t?parseFloat(t.attr("aria-valuenow")):e)>=0?n%r:r+n%r)?n:n=n>=(o=n-i)+s?o+r:o}},{key:"_events",value:function(){this._eventsForHandle(this.$handle),this.handles[1]&&this._eventsForHandle(this.$handle2)}},{key:"_eventsForHandle",value:function(t){var e,n=this,i=function(t){var e=n.inputs.index(o()(this));n._handleEvent(t,n.handles.eq(e),o()(this).val())};if(this.inputs.off("keyup.zf.slider").on("keyup.zf.slider",(function(t){13===t.keyCode&&i.call(this,t)})),this.inputs.off("change.zf.slider").on("change.zf.slider",i),this.options.clickSelect&&this.$element.off("click.zf.slider").on("click.zf.slider",(function(t){if(n.$element.data("dragging"))return!1;o()(t.target).is("[data-slider-handle]")||(n.options.doubleSided?n._handleEvent(t):n._handleEvent(t,n.$handle))})),this.options.draggable){this.handles.addTouch();var s=o()("body");t.off("mousedown.zf.slider").on("mousedown.zf.slider",(function(i){t.addClass("is-dragging"),n.$fill.addClass("is-dragging"),n.$element.data("dragging",!0),e=o()(i.currentTarget),s.on("mousemove.zf.slider",(function(t){t.preventDefault(),n._handleEvent(t,e)})).on("mouseup.zf.slider",(function(i){n._handleEvent(i,e),t.removeClass("is-dragging"),n.$fill.removeClass("is-dragging"),n.$element.data("dragging",!1),s.off("mousemove.zf.slider mouseup.zf.slider")}))})).on("selectstart.zf.slider touchmove.zf.slider",(function(t){t.preventDefault()}))}t.off("keydown.zf.slider").on("keydown.zf.slider",(function(e){var i,s=o()(this),a=(n.options.doubleSided&&n.handles.index(s),parseFloat(t.attr("aria-valuenow")));r.Keyboard.handleKey(e,"Slider",{decrease:function(){i=a-n.options.step},increase:function(){i=a+n.options.step},decreaseFast:function(){i=a-10*n.options.step},increaseFast:function(){i=a+10*n.options.step},min:function(){i=n.options.start},max:function(){i=n.options.end},handled:function(){e.preventDefault(),n._setHandlePos(s,i)}})}))}},{key:"_destroy",value:function(){this.handles.off(".zf.slider"),this.inputs.off(".zf.slider"),this.$element.off(".zf.slider"),clearTimeout(this.timeout)}}])&&d(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),y}(l.Plugin);function m(t,e){return t/e}function g(t,e,n,i){return Math.abs(t.position()[e]+t[i]()/2-n)}v.defaults={start:0,end:100,step:1,initialStart:0,initialEnd:100,binding:!1,clickSelect:!0,vertical:!1,draggable:!0,disabled:!1,doubleSided:!1,decimal:2,moveTime:200,disabledClass:"disabled",invertVertical:!1,changedDelay:500,nonLinearBase:5,positionValueFunction:"linear"}},"./js/foundation.smoothScroll.js":function(t,e,n){n.r(e),n.d(e,{SmoothScroll:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js");function s(t){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},s(t)}function a(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:h.defaults,n=arguments.length>2?arguments[2]:void 0,i=o()(t);if(!i.length)return!1;var r=Math.round(i.offset().top-e.threshold/2-e.offset);o()("html, body").stop(!0).animate({scrollTop:r},e.animationDuration,e.animationEasing,(function(){"function"==typeof n&&n()}))}}],(n=[{key:"_setup",value:function(t,e){this.$element=t,this.options=o().extend({},h.defaults,this.$element.data(),e),this.className="SmoothScroll",this._init()}},{key:"_init",value:function(){var t=this.$element[0].id||(0,r.GetYoDigits)(6,"smooth-scroll");this.$element.attr({id:t}),this._events()}},{key:"_events",value:function(){this._linkClickListener=this._handleLinkClick.bind(this),this.$element.on("click.zf.smoothScroll",this._linkClickListener),this.$element.on("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}},{key:"_handleLinkClick",value:function(t){var e=this;if(o()(t.currentTarget).is('a[href^="#"]')){var n=t.currentTarget.getAttribute("href");this._inTransition=!0,h.scrollToLoc(n,this.options,(function(){e._inTransition=!1})),t.preventDefault()}}},{key:"_destroy",value:function(){this.$element.off("click.zf.smoothScroll",this._linkClickListener),this.$element.off("click.zf.smoothScroll",'a[href^="#"]',this._linkClickListener)}}])&&a(e.prototype,n),i&&a(e,i),Object.defineProperty(e,"prototype",{writable:!1}),h}(n("./js/foundation.core.plugin.js").Plugin);c.defaults={animationDuration:500,animationEasing:"linear",threshold:50,offset:0}},"./js/foundation.sticky.js":function(t,e,n){n.r(e),n.d(e,{Sticky:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.mediaQuery.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=n.topPoint))})),n._events(e.split("-").reverse().join("-"))}))}},{key:"_parsePoints",value:function(){for(var t=[""===this.options.topAnchor?1:this.options.topAnchor,""===this.options.btmAnchor?document.documentElement.scrollHeight:this.options.btmAnchor],e={},n=0,i=t.length;n=this.topPoint?e<=this.bottomPoint?this.isStuck||this._setSticky():this.isStuck&&this._removeSticky(!1):this.isStuck&&this._removeSticky(!0)}},{key:"_setSticky",value:function(){var t=this,e=this.options.stickTo,n="top"===e?"marginTop":"marginBottom",i="top"===e?"bottom":"top",o={};o[n]="".concat(this.options[n],"em"),o[e]=0,o[i]="auto",this.isStuck=!0,this.$element.removeClass("is-anchored is-at-".concat(i)).addClass("is-stuck is-at-".concat(e)).css(o).trigger("sticky.zf.stuckto:".concat(e)),this.$element.on("transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",(function(){t._setSizes()}))}},{key:"_removeSticky",value:function(t){var e=this.options.stickTo,n="top"===e,i={},o=(this.points?this.points[1]-this.points[0]:this.anchorHeight)-this.elemHeight,r=t?"top":"bottom";i[n?"marginTop":"marginBottom"]=0,i.bottom="auto",i.top=t?0:o,this.isStuck=!1,this.$element.removeClass("is-stuck is-at-".concat(e)).addClass("is-anchored is-at-".concat(r)).css(i).trigger("sticky.zf.unstuckfrom:".concat(r))}},{key:"_setSizes",value:function(t){this.canStick=a.MediaQuery.is(this.options.stickyOn),this.canStick||t&&"function"==typeof t&&t();var e=this.$container[0].getBoundingClientRect().width,n=window.getComputedStyle(this.$container[0]),i=parseInt(n["padding-left"],10),o=parseInt(n["padding-right"],10);if(this.$anchor&&this.$anchor.length?this.anchorHeight=this.$anchor[0].getBoundingClientRect().height:this._parsePoints(),this.$element.css({"max-width":"".concat(e-i-o,"px")}),this.options.dynamicHeight||!this.containerHeight){var r=this.$element[0].getBoundingClientRect().height||this.containerHeight;r="none"===this.$element.css("display")?0:r,this.$container.css("height",r),this.containerHeight=r}if(this.elemHeight=this.containerHeight,!this.isStuck&&this.$element.hasClass("is-at-bottom")){var s=(this.points?this.points[1]-this.$container.offset().top:this.anchorHeight)-this.elemHeight;this.$element.css("top",s)}this._setBreakPoints(this.containerHeight,(function(){t&&"function"==typeof t&&t()}))}},{key:"_setBreakPoints",value:function(t,e){if(!this.canStick){if(!e||"function"!=typeof e)return!1;e()}var n=p(this.options.marginTop),i=p(this.options.marginBottom),o=this.points?this.points[0]:this.$anchor.offset().top,r=this.points?this.points[1]:o+this.anchorHeight,s=window.innerHeight;"top"===this.options.stickTo?(o-=n,r-=t+n):"bottom"===this.options.stickTo&&(o-=s-(t+i),r-=s-i),this.topPoint=o,this.bottomPoint=r,e&&"function"==typeof e&&e()}},{key:"_destroy",value:function(){this._removeSticky(!0),this.$element.removeClass("".concat(this.options.stickyClass," is-anchored is-at-top")).css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger").off("mutateme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),this.scrollListener&&o()(window).off(this.scrollListener),this.onLoadListener&&o()(window).off(this.onLoadListener),this.wasWrapped?this.$element.unwrap():this.$container.removeClass(this.options.containerClass).css({height:""})}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(r.Plugin);function p(t){return parseInt(window.getComputedStyle(document.body,null).fontSize,10)*t}h.defaults={container:"
                                    ",stickTo:"top",anchor:"",topAnchor:"",btmAnchor:"",marginTop:1,marginBottom:1,stickyOn:"medium",stickyClass:"sticky",containerClass:"sticky-container",dynamicHeight:!0,checkEvery:-1}},"./js/foundation.tabs.js":function(t,e,n){n.r(e),n.d(e,{Tabs:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.plugin.js"),s=n("./js/foundation.core.utils.js"),a=n("./js/foundation.util.keyboard.js"),l=n("./js/foundation.util.imageLoader.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n=0?e.slice(1):e,i=n&&o()("#".concat(n)),r=e&&t.$element.find('[href$="'.concat(e,'"],[data-tabs-target="').concat(n,'"]')).first();if(i.length&&r.length){if(i&&i.length&&r&&r.length?t.selectTab(i,!0):t._collapse(),t.options.deepLinkSmudge){var s=t.$element.offset();o()("html, body").animate({scrollTop:s.top-t.options.deepLinkSmudgeOffset},t.options.deepLinkSmudgeDelay)}t.$element.trigger("deeplink.zf.tabs",[r,i])}},this.options.deepLink&&this._checkDeepLink(),this._events(),this._isInitializing=!1}},{key:"_events",value:function(){this._addKeyHandler(),this._addClickHandler(),this._setHeightMqHandler=null,this.options.matchHeight&&(this._setHeightMqHandler=this._setHeight.bind(this),o()(window).on("changed.zf.mediaquery",this._setHeightMqHandler)),this.options.deepLink&&o()(window).on("hashchange",this._checkDeepLink)}},{key:"_addClickHandler",value:function(){var t=this;this.$element.off("click.zf.tabs").on("click.zf.tabs",".".concat(this.options.linkClass),(function(e){e.preventDefault(),t._handleTabChange(o()(this))}))}},{key:"_addKeyHandler",value:function(){var t=this;this.$tabTitles.off("keydown.zf.tabs").on("keydown.zf.tabs",(function(e){if(9!==e.which){var n,i,r=o()(this),s=r.parent("ul").children("li");s.each((function(e){o()(this).is(r)&&(t.options.wrapOnKeys?(n=0===e?s.last():s.eq(e-1),i=e===s.length-1?s.first():s.eq(e+1)):(n=s.eq(Math.max(0,e-1)),i=s.eq(Math.min(e+1,s.length-1))))})),a.Keyboard.handleKey(e,"Tabs",{open:function(){r.find('[role="tab"]').focus(),t._handleTabChange(r)},previous:function(){n.find('[role="tab"]').focus(),t._handleTabChange(n)},next:function(){i.find('[role="tab"]').focus(),t._handleTabChange(i)},handled:function(){e.preventDefault()}})}}))}},{key:"_handleTabChange",value:function(t,e){if(t.hasClass("".concat(this.options.linkActiveClass)))this.options.activeCollapse&&this._collapse();else{var n=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass)),i=t.find('[role="tab"]'),o=i.attr("data-tabs-target"),r=o&&o.length?"#".concat(o):i[0].hash,s=this.$tabContent.find(r);this._collapseTab(n),this._openTab(t),this.options.deepLink&&!e&&(this.options.updateHistory?history.pushState({},"",r):history.replaceState({},"",r)),this.$element.trigger("change.zf.tabs",[t,s]),s.find("[data-mutate]").trigger("mutateme.zf.trigger")}}},{key:"_openTab",value:function(t){var e=t.find('[role="tab"]'),n=e.attr("data-tabs-target")||e[0].hash.slice(1),i=this.$tabContent.find("#".concat(n));t.addClass("".concat(this.options.linkActiveClass)),e.attr({"aria-selected":"true",tabindex:"0"}),i.addClass("".concat(this.options.panelActiveClass)).removeAttr("aria-hidden")}},{key:"_collapseTab",value:function(t){var e=t.removeClass("".concat(this.options.linkActiveClass)).find('[role="tab"]').attr({"aria-selected":"false",tabindex:-1});o()("#".concat(e.attr("aria-controls"))).removeClass("".concat(this.options.panelActiveClass)).attr({"aria-hidden":"true"})}},{key:"_collapse",value:function(){var t=this.$element.find(".".concat(this.options.linkClass,".").concat(this.options.linkActiveClass));t.length&&(this._collapseTab(t),this.$element.trigger("collapse.zf.tabs",[t]))}},{key:"selectTab",value:function(t,e){var n,i;(n="object"===u(t)?t[0].id:t).indexOf("#")<0?i="#".concat(n):(i=n,n=n.slice(1));var o=this.$tabTitles.has('[href$="'.concat(i,'"],[data-tabs-target="').concat(n,'"]')).first();this._handleTabChange(o,e)}},{key:"_setHeight",value:function(){var t=0,e=this;this.$tabContent&&this.$tabContent.find(".".concat(this.options.panelClass)).css("min-height","").each((function(){var n=o()(this),i=n.hasClass("".concat(e.options.panelActiveClass));i||n.css({visibility:"hidden",display:"block"});var r=this.getBoundingClientRect().height;i||n.css({visibility:"",display:""}),t=r>t?r:t})).css("min-height","".concat(t,"px"))}},{key:"_destroy",value:function(){this.$element.find(".".concat(this.options.linkClass)).off(".zf.tabs").hide().end().find(".".concat(this.options.panelClass)).hide(),this.options.matchHeight&&null!=this._setHeightMqHandler&&o()(window).off("changed.zf.mediaquery",this._setHeightMqHandler),this.options.deepLink&&o()(window).off("hashchange",this._checkDeepLink),this.onLoadListener&&o()(window).off(this.onLoadListener)}}])&&c(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),p}(r.Plugin);h.defaults={deepLink:!1,deepLinkSmudge:!1,deepLinkSmudgeDelay:300,deepLinkSmudgeOffset:0,updateHistory:!1,autoFocus:!1,wrapOnKeys:!0,matchHeight:!1,activeCollapse:!1,linkClass:"tabs-title",linkActiveClass:"is-active",panelClass:"tabs-panel",panelActiveClass:"is-active"}},"./js/foundation.toggler.js":function(t,e,n){n.r(e),n.d(e,{Toggler:function(){return h}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.util.motion.js"),s=n("./js/foundation.core.plugin.js"),a=n("./js/foundation.core.utils.js"),l=n("./js/foundation.util.triggers.js");function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function c(t,e){for(var n=0;n").addClass(e).attr({role:"tooltip","aria-hidden":!0,"data-is-active":!1,"data-is-focus":!1,id:t})}},{key:"_setPosition",value:function(){c(d(v.prototype),"_setPosition",this).call(this,this.$element,this.template)}},{key:"show",value:function(){if("all"!==this.options.showOn&&!s.MediaQuery.is(this.options.showOn))return!1;this.template.css("visibility","hidden").show(),this._setPosition(),this.template.removeClass("top bottom left right").addClass(this.position),this.template.removeClass("align-top align-bottom align-left align-right align-center").addClass("align-"+this.alignment),this.$element.trigger("closeme.zf.tooltip",this.template.attr("id")),this.template.attr({"data-is-active":!0,"aria-hidden":!1}),this.isActive=!0,this.template.stop().hide().css("visibility","").fadeIn(this.options.fadeInDuration,(function(){})),this.$element.trigger("show.zf.tooltip")}},{key:"hide",value:function(){var t=this;this.template.stop().attr({"aria-hidden":!0,"data-is-active":!1}).fadeOut(this.options.fadeOutDuration,(function(){t.isActive=!1,t.isClick=!1})),this.$element.trigger("hide.zf.tooltip")}},{key:"_events",value:function(){var t=this,e="ontouchstart"in window||void 0!==window.ontouchstart,n=!1;e&&this.options.disableForTouch||(this.options.disableHover||this.$element.on("mouseenter.zf.tooltip",(function(){t.isActive||(t.timeout=setTimeout((function(){t.show()}),t.options.hoverDelay))})).on("mouseleave.zf.tooltip",(0,r.ignoreMousedisappear)((function(){clearTimeout(t.timeout),(!n||t.isClick&&!t.options.clickOpen)&&t.hide()}))),e&&this.$element.on("tap.zf.tooltip touchend.zf.tooltip",(function(){t.isActive?t.hide():t.show()})),this.options.clickOpen?this.$element.on("mousedown.zf.tooltip",(function(){t.isClick||(t.isClick=!0,!t.options.disableHover&&t.$element.attr("tabindex")||t.isActive||t.show())})):this.$element.on("mousedown.zf.tooltip",(function(){t.isClick=!0})),this.$element.on({"close.zf.trigger":this.hide.bind(this)}),this.$element.on("focus.zf.tooltip",(function(){if(n=!0,t.isClick)return t.options.clickOpen||(n=!1),!1;t.show()})).on("focusout.zf.tooltip",(function(){n=!1,t.isClick=!1,t.hide()})).on("resizeme.zf.trigger",(function(){t.isActive&&t._setPosition()})))}},{key:"toggle",value:function(){this.isActive?this.hide():this.show()}},{key:"_destroy",value:function(){this.$element.attr("title",this.template.text()).off(".zf.trigger .zf.tooltip").removeClass(this.options.triggerClass).removeClass("top right left bottom").removeAttr("aria-describedby data-disable-hover data-resize data-toggle data-tooltip data-yeti-box"),this.template.remove()}}])&&u(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),v}(n("./js/foundation.positionable.js").Positionable);h.defaults={hoverDelay:200,fadeInDuration:150,fadeOutDuration:150,disableHover:!1,disableForTouch:!1,templateClasses:"",tooltipClass:"tooltip",triggerClass:"has-tip",showOn:"small",template:"",tipText:"",touchCloseText:"Tap to close.",clickOpen:!0,position:"auto",alignment:"auto",allowOverlap:!1,allowBottomOverlap:!1,vOffset:0,hOffset:0,tooltipHeight:14,tooltipWidth:12,allowHtml:!1}},"./js/foundation.util.box.js":function(t,e,n){n.r(e),n.d(e,{Box:function(){return i}});var i={ImNotTouchingYou:function(t,e,n,i,r){return 0===o(t,e,n,i,r)},OverlapArea:o,GetDimensions:r,GetExplicitOffsets:function(t,e,n,i,o,s,a){var l,u,c=r(t),f=e?r(e):null;if(null!==f){switch(n){case"top":l=f.offset.top-(c.height+o);break;case"bottom":l=f.offset.top+f.height+o;break;case"left":u=f.offset.left-(c.width+s);break;case"right":u=f.offset.left+f.width+s}switch(n){case"top":case"bottom":switch(i){case"left":u=f.offset.left+s;break;case"right":u=f.offset.left-c.width+f.width-s;break;case"center":u=a?s:f.offset.left+f.width/2-c.width/2+s}break;case"right":case"left":switch(i){case"bottom":l=f.offset.top-o+f.height-c.height;break;case"top":l=f.offset.top+o;break;case"center":l=f.offset.top+o+f.height/2-c.height/2}}}return{top:l,left:u}}};function o(t,e,n,i,o){var s,a,l,u,c=r(t);if(e){var f=r(e);a=f.height+f.offset.top-(c.offset.top+c.height),s=c.offset.top-f.offset.top,l=c.offset.left-f.offset.left,u=f.width+f.offset.left-(c.offset.left+c.width)}else a=c.windowDims.height+c.windowDims.offset.top-(c.offset.top+c.height),s=c.offset.top-c.windowDims.offset.top,l=c.offset.left-c.windowDims.offset.left,u=c.windowDims.width-(c.offset.left+c.width);return a=o?0:Math.min(a,0),s=Math.min(s,0),l=Math.min(l,0),u=Math.min(u,0),n?l+u:i?s+a:Math.sqrt(s*s+a*a+l*l+u*u)}function r(t){if((t=t.length?t[0]:t)===window||t===document)throw new Error("I'm sorry, Dave. I'm afraid I can't do that.");var e=t.getBoundingClientRect(),n=t.parentNode.getBoundingClientRect(),i=document.body.getBoundingClientRect(),o=window.pageYOffset,r=window.pageXOffset;return{width:e.width,height:e.height,offset:{top:e.top+o,left:e.left+r},parentDims:{width:n.width,height:n.height,offset:{top:n.top+o,left:n.left+r}},windowDims:{width:i.width,height:i.height,offset:{top:o,left:r}}}}},"./js/foundation.util.imageLoader.js":function(t,e,n){n.r(e),n.d(e,{onImagesLoaded:function(){return r}});var i=n("jquery"),o=n.n(i);function r(t,e){var n=t.length;function i(){0==--n&&e()}0===n&&e(),t.each((function(){if(this.complete&&void 0!==this.naturalWidth)i();else{var t=new Image,e="load.zf.images error.zf.images";o()(t).one(e,(function t(){o()(this).off(e,t),i()})),t.src=o()(this).attr("src")}}))}},"./js/foundation.util.keyboard.js":function(t,e,n){n.r(e),n.d(e,{Keyboard:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s={9:"TAB",13:"ENTER",27:"ESCAPE",32:"SPACE",35:"END",36:"HOME",37:"ARROW_LEFT",38:"ARROW_UP",39:"ARROW_RIGHT",40:"ARROW_DOWN"},a={};function l(t){return!!t&&t.find("a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]").filter((function(){return!(!o()(this).is(":visible")||o()(this).attr("tabindex")<0)})).sort((function(t,e){if(o()(t).attr("tabindex")===o()(e).attr("tabindex"))return 0;var n=parseInt(o()(t).attr("tabindex"),10),i=parseInt(o()(e).attr("tabindex"),10);return void 0===o()(t).attr("tabindex")&&i>0?1:void 0===o()(e).attr("tabindex")&&n>0?-1:0===n&&i>0?1:0===i&&n>0||ni?1:void 0}))}function u(t){var e=s[t.which||t.keyCode]||String.fromCharCode(t.which).toUpperCase();return e=e.replace(/\W+/,""),t.shiftKey&&(e="SHIFT_".concat(e)),t.ctrlKey&&(e="CTRL_".concat(e)),t.altKey&&(e="ALT_".concat(e)),e.replace(/_$/,"")}var c={keys:function(t){var e={};for(var n in t)t.hasOwnProperty(n)&&(e[t[n]]=t[n]);return e}(s),parseKey:u,handleKey:function(t,e,n){var i,s=a[e],l=this.parseKey(t);if(!s)return console.warn("Component not defined!");if(!0!==t.zfIsKeyHandled)if((i=n[(void 0===s.ltr?s:(0,r.rtl)()?o().extend({},s.ltr,s.rtl):o().extend({},s.rtl,s.ltr))[l]])&&"function"==typeof i){var u=i.apply();t.zfIsKeyHandled=!0,(n.handled||"function"==typeof n.handled)&&n.handled(u)}else(n.unhandled||"function"==typeof n.unhandled)&&n.unhandled()},findFocusable:l,register:function(t,e){a[t]=e},trapFocus:function(t){var e=l(t),n=e.eq(0),i=e.eq(-1);t.on("keydown.zf.trapfocus",(function(t){t.target===i[0]&&"TAB"===u(t)?(t.preventDefault(),n.focus()):t.target===n[0]&&"SHIFT_TAB"===u(t)&&(t.preventDefault(),i.focus())}))},releaseFocus:function(t){t.off("keydown.zf.trapfocus")}}},"./js/foundation.util.mediaQuery.js":function(t,e,n){n.r(e),n.d(e,{MediaQuery:function(){return a}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,i=new Array(e);n').appendTo(document.head);var t,e,n,i=o()(".foundation-mq").css("font-family");for(var r in n=void 0,n={},t="string"!=typeof(e=i)?n:(e=e.trim().slice(1,-1))?(n=e.split("&").reduce((function(t,e){var n=e.replace(/\+/g," ").split("="),i=n[0],o=n[1];return i=decodeURIComponent(i),o=void 0===o?null:decodeURIComponent(o),t.hasOwnProperty(i)?Array.isArray(t[i])?t[i].push(o):t[i]=[t[i],o]:t[i]=o,t}),{}),n):n,this.queries=[],t)t.hasOwnProperty(r)&&this.queries.push({name:r,value:"only screen and (min-width: ".concat(t[r],")")});this.current=this._getCurrentSize(),this._watcher()},_reInit:function(){this.isInitialized=!1,this._init()},atLeast:function(t){var e=this.get(t);return!!e&&window.matchMedia(e).matches},only:function(t){return t===this._getCurrentSize()},upTo:function(t){var e=this.next(t);return!e||!this.atLeast(e)},is:function(t){var e,n,i=(e=t.trim().split(" ").filter((function(t){return!!t.length})),n=2,function(t){if(Array.isArray(t))return t}(e)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var i,o,r,s,a=[],l=!0,u=!1;try{if(r=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(i=r.call(n)).done)&&(a.push(i.value),a.length!==e);l=!0);}catch(t){u=!0,o=t}finally{try{if(!l&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(u)throw o}}return a}}(e,n)||function(t,e){if(t){if("string"==typeof t)return s(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(t,e):void 0}}(e,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),o=i[0],r=i[1],a=void 0===r?"":r;if("only"===a)return this.only(o);if(!a||"up"===a)return this.atLeast(o);if("down"===a)return this.upTo(o);throw new Error('\n Invalid breakpoint passed to MediaQuery.is().\n Expected a breakpoint name formatted like " ", got "'.concat(t,'".\n '))},get:function(t){for(var e in this.queries)if(this.queries.hasOwnProperty(e)){var n=this.queries[e];if(t===n.name)return n.value}return null},next:function(t){var e=this,n=this.queries.findIndex((function(n){return e._getQueryName(n)===t}));if(-1===n)throw new Error('\n Unknown breakpoint "'.concat(t,'" passed to MediaQuery.next().\n Ensure it is present in your Sass "$breakpoints" setting.\n '));var i=this.queries[n+1];return i?i.name:null},_getQueryName:function(t){if("string"==typeof t)return t;if("object"===r(t))return t.name;throw new TypeError('\n Invalid value passed to MediaQuery._getQueryName().\n Expected a breakpoint name (String) or a breakpoint query (Object), got "'.concat(t,'" (').concat(r(t),")\n "))},_getCurrentSize:function(){for(var t,e=0;e1&&void 0!==arguments[1]?arguments[1]:"zf";t.attr("role","menubar"),t.find("a").attr({role:"menuitem"});var n=t.find("li").attr({role:"none"}),i="is-".concat(e,"-submenu"),r="".concat(i,"-item"),s="is-".concat(e,"-submenu-parent"),a="accordion"!==e;n.each((function(){var t=o()(this),n=t.children("ul");if(n.length){if(t.addClass(s),a){var l=t.children("a:first");l.attr({"aria-haspopup":!0,"aria-label":l.attr("aria-label")||l.text()}),"drilldown"===e&&t.attr({"aria-expanded":!1})}n.addClass("submenu ".concat(i)).attr({"data-submenu":"",role:"menubar"}),"drilldown"===e&&n.attr({"aria-hidden":!0})}t.parent("[data-submenu]").length&&t.addClass("is-submenu-item ".concat(r))}))},Burn:function(t,e){var n="is-".concat(e,"-submenu"),i="".concat(n,"-item"),o="is-".concat(e,"-submenu-parent");t.find(">li, > li > ul, .menu, .menu > li, [data-submenu] > li").removeClass("".concat(n," ").concat(i," ").concat(o," is-submenu-item submenu is-active")).removeAttr("data-submenu").css("display","")}}},"./js/foundation.util.timer.js":function(t,e,n){function i(t,e,n){var i,o,r=this,s=e.duration,a=Object.keys(t.data())[0]||"timer",l=-1;this.isPaused=!1,this.restart=function(){l=-1,clearTimeout(o),this.start()},this.start=function(){this.isPaused=!1,clearTimeout(o),l=l<=0?s:l,t.data("paused",!1),i=Date.now(),o=setTimeout((function(){e.infinite&&r.restart(),n&&"function"==typeof n&&n()}),l),t.trigger("timerstart.zf.".concat(a))},this.pause=function(){this.isPaused=!0,clearTimeout(o),t.data("paused",!0);var e=Date.now();l-=e-i,t.trigger("timerpaused.zf.".concat(a))}}n.r(e),n.d(e,{Timer:function(){return i}})},"./js/foundation.util.touch.js":function(t,e,n){n.r(e),n.d(e,{Touch:function(){return f}});var i=n("jquery"),o=n.n(i);function r(t){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},r(t)}function s(t,e){for(var n=0;n=o().spotSwipe.moveThreshold&&u<=o().spotSwipe.timeThreshold&&(e=i>0?"left":"right"),e&&(t.preventDefault(),p.apply(this,arguments),o()(this).trigger(o().Event("swipe",Object.assign({},t)),e).trigger(o().Event("swipe".concat(e),Object.assign({},t))))}}function m(t){1===t.touches.length&&(a=t.touches[0].pageX,c=t,d=!0,h=!1,l=(new Date).getTime(),this.addEventListener("touchmove",v,{passive:!0===o().spotSwipe.preventDefault}),this.addEventListener("touchend",p,!1))}function g(){this.addEventListener&&this.addEventListener("touchstart",m,{passive:!0})}var y=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.version="1.0.0",this.enabled="ontouchstart"in document.documentElement,this.preventDefault=!1,this.moveThreshold=75,this.timeThreshold=200,this._init()}var e,n;return e=t,(n=[{key:"_init",value:function(){o().event.special.swipe={setup:g},o().event.special.tap={setup:g},o().each(["left","up","down","right"],(function(){o().event.special["swipe".concat(this)]={setup:function(){o()(this).on("swipe",o().noop)}}}))}}])&&s(e.prototype,n),Object.defineProperty(e,"prototype",{writable:!1}),t}();f.setupSpotSwipe=function(){o().spotSwipe=new y(o())},f.setupTouchHandler=function(){o().fn.addTouch=function(){this.each((function(e,n){o()(n).bind("touchstart touchmove touchend touchcancel",(function(e){t(e)}))}));var t=function(t){var e,n=t.changedTouches[0],i={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"}[t.type];"MouseEvent"in window&&"function"==typeof window.MouseEvent?e=new window.MouseEvent(i,{bubbles:!0,cancelable:!0,screenX:n.screenX,screenY:n.screenY,clientX:n.clientX,clientY:n.clientY}):(e=document.createEvent("MouseEvent")).initMouseEvent(i,!0,!0,window,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(e)}}},f.init=function(){void 0===o().spotSwipe&&(f.setupSpotSwipe(o()),f.setupTouchHandler(o()))}},"./js/foundation.util.triggers.js":function(t,e,n){n.r(e),n.d(e,{Triggers:function(){return c}});var i=n("jquery"),o=n.n(i),r=n("./js/foundation.core.utils.js"),s=n("./js/foundation.util.motion.js");function a(t){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a(t)}var l=function(){for(var t=["WebKit","Moz","O","Ms",""],e=0;e0&&e-1 in t)}function O(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}x.fn=x.prototype={jquery:_,constructor:x,length:0,toArray:function(){return a.call(this)},get:function(t){return null==t?a.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=x.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return x.each(this,t)},map:function(t){return this.pushStack(x.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(a.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(x.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(x.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+z+")"+z+"*"),F=new RegExp(z+"|>"),N=new RegExp(M),B=new RegExp("^"+A+"$"),W={ID:new RegExp("^#("+A+")"),CLASS:new RegExp("^\\.("+A+")"),TAG:new RegExp("^("+A+"|[*])"),ATTR:new RegExp("^"+R),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+z+"*(even|odd|(([+-]|)(\\d*)n|)"+z+"*(?:([+-]|)"+z+"*(\\d+)|))"+z+"*\\)|)","i"),bool:new RegExp("^(?:"+C+")$","i"),needsContext:new RegExp("^"+z+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+z+"*((?:-\\d)?\\d*)"+z+"*\\)|)(?=[^-]|$)","i")},Q=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,U=new RegExp("\\\\[\\da-fA-F]{1,6}"+z+"?|\\\\([^\\r\\n\\f])","g"),V=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},X=function(){lt()},Z=dt((function(t){return!0===t.disabled&&O(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{v.apply(r=a.call(D.childNodes),D.childNodes),r[D.childNodes.length].nodeType}catch(t){v={apply:function(t,e){L.apply(t,a.call(e))},call:function(t){L.apply(t,a.call(arguments,1))}}}function J(t,e,n,i){var o,r,s,a,u,c,h,p=e&&e.ownerDocument,y=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==y&&9!==y&&11!==y)return n;if(!i&&(lt(e),e=e||l,f)){if(11!==y&&(u=Y.exec(t)))if(o=u[1]){if(9===y){if(!(s=e.getElementById(o)))return n;if(s.id===o)return v.call(n,s),n}else if(p&&(s=p.getElementById(o))&&J.contains(e,s)&&s.id===o)return v.call(n,s),n}else{if(u[2])return v.apply(n,e.getElementsByTagName(t)),n;if((o=u[3])&&e.getElementsByClassName)return v.apply(n,e.getElementsByClassName(o)),n}if(!(_[t+" "]||d&&d.test(t))){if(h=t,p=e,1===y&&(F.test(t)||I.test(t))){for((p=K.test(t)&&at(e.parentNode)||e)==e&&m.scope||((a=e.getAttribute("id"))?a=x.escapeSelector(a):e.setAttribute("id",a=g)),r=(c=ct(t)).length;r--;)c[r]=(a?"#"+a:":scope")+" "+ft(c[r]);h=c.join(",")}try{return v.apply(n,p.querySelectorAll(h)),n}catch(e){_(t,!0)}finally{a===g&&e.removeAttribute("id")}}}return yt(t.replace(P,"$1"),e,n,i)}function tt(){var t=[];return function n(i,o){return t.push(i+" ")>e.cacheLength&&delete n[t.shift()],n[i+" "]=o}}function et(t){return t[g]=!0,t}function nt(t){var e=l.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function it(t){return function(e){return O(e,"input")&&e.type===t}}function ot(t){return function(e){return(O(e,"input")||O(e,"button"))&&e.type===t}}function rt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&Z(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function st(t){return et((function(e){return e=+e,et((function(n,i){for(var o,r=t([],n.length,e),s=r.length;s--;)n[o=r[s]]&&(n[o]=!(i[o]=n[o]))}))}))}function at(t){return t&&void 0!==t.getElementsByTagName&&t}function lt(t){var n,i=t?t.ownerDocument||t:D;return i!=l&&9===i.nodeType&&i.documentElement?(u=(l=i).documentElement,f=!x.isXMLDoc(l),p=u.matches||u.webkitMatchesSelector||u.msMatchesSelector,u.msMatchesSelector&&D!=l&&(n=l.defaultView)&&n.top!==n&&n.addEventListener("unload",X),m.getById=nt((function(t){return u.appendChild(t).id=x.expando,!l.getElementsByName||!l.getElementsByName(x.expando).length})),m.disconnectedMatch=nt((function(t){return p.call(t,"*")})),m.scope=nt((function(){return l.querySelectorAll(":scope")})),m.cssHas=nt((function(){try{return l.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),m.getById?(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(U,V);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&f){var n,i,o,r=e.getElementById(t);if(r){if((n=r.getAttributeNode("id"))&&n.value===t)return[r];for(o=e.getElementsByName(t),i=0;r=o[i++];)if((n=r.getAttributeNode("id"))&&n.value===t)return[r]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&f)return e.getElementsByClassName(t)},d=[],nt((function(t){var e;u.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||d.push("\\["+z+"*(?:value|"+C+")"),t.querySelectorAll("[id~="+g+"-]").length||d.push("~="),t.querySelectorAll("a#"+g+"+*").length||d.push(".#.+[+~]"),t.querySelectorAll(":checked").length||d.push(":checked"),(e=l.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),u.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(e=l.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||d.push("\\["+z+"*name"+z+"*="+z+"*(?:''|\"\")")})),m.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),$=function(t,e){if(t===e)return s=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!m.sortDetached&&e.compareDocumentPosition(t)===n?t===l||t.ownerDocument==D&&J.contains(D,t)?-1:e===l||e.ownerDocument==D&&J.contains(D,e)?1:o?c.call(o,t)-c.call(o,e):0:4&n?-1:1)},l):l}for(t in J.matches=function(t,e){return J(t,null,null,e)},J.matchesSelector=function(t,e){if(lt(t),f&&!_[e+" "]&&(!d||!d.test(e)))try{var n=p.call(t,e);if(n||m.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){_(e,!0)}return J(e,l,null,[t]).length>0},J.contains=function(t,e){return(t.ownerDocument||t)!=l&<(t),x.contains(t,e)},J.attr=function(t,n){(t.ownerDocument||t)!=l&<(t);var i=e.attrHandle[n.toLowerCase()],o=i&&h.call(e.attrHandle,n.toLowerCase())?i(t,n,!f):void 0;return void 0!==o?o:t.getAttribute(n)},J.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},x.uniqueSort=function(t){var e,n=[],i=0,r=0;if(s=!m.sortStable,o=!m.sortStable&&a.call(t,0),S.call(t,$),s){for(;e=t[r++];)e===t[r]&&(i=n.push(r));for(;i--;)E.call(t,n[i],1)}return o=null,t},x.fn.uniqueSort=function(){return this.pushStack(x.uniqueSort(a.apply(this)))},e=x.expr={cacheLength:50,createPseudo:et,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(U,V),t[3]=(t[3]||t[4]||t[5]||"").replace(U,V),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||J.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&J.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return W.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&N.test(n)&&(e=ct(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(U,V).toLowerCase();return"*"===t?function(){return!0}:function(t){return O(t,e)}},CLASS:function(t){var e=w[t+" "];return e||(e=new RegExp("(^|"+z+")"+t+"("+z+"|$)"))&&w(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(i){var o=J.attr(i,t);return null==o?"!="===e:!e||(o+="","="===e?o===n:"!="===e?o!==n:"^="===e?n&&0===o.indexOf(n):"*="===e?n&&o.indexOf(n)>-1:"$="===e?n&&o.slice(-n.length)===n:"~="===e?(" "+o.replace(H," ")+" ").indexOf(n)>-1:"|="===e&&(o===n||o.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,i,o){var r="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===i&&0===o?function(t){return!!t.parentNode}:function(e,n,l){var u,c,f,d,h,p=r!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),b=!l&&!a,w=!1;if(v){if(r){for(;p;){for(f=e;f=f[p];)if(a?O(f,m):1===f.nodeType)return!1;h=p="only"===t&&!h&&"nextSibling"}return!0}if(h=[s?v.firstChild:v.lastChild],s&&b){for(w=(d=(u=(c=v[g]||(v[g]={}))[t]||[])[0]===y&&u[1])&&u[2],f=d&&v.childNodes[d];f=++d&&f&&f[p]||(w=d=0)||h.pop();)if(1===f.nodeType&&++w&&f===e){c[t]=[y,d,w];break}}else if(b&&(w=d=(u=(c=e[g]||(e[g]={}))[t]||[])[0]===y&&u[1]),!1===w)for(;(f=++d&&f&&f[p]||(w=d=0)||h.pop())&&(!(a?O(f,m):1===f.nodeType)||!++w||(b&&((c=f[g]||(f[g]={}))[t]=[y,w]),f!==e)););return(w-=o)===i||w%i==0&&w/i>=0}}},PSEUDO:function(t,n){var i,o=e.pseudos[t]||e.setFilters[t.toLowerCase()]||J.error("unsupported pseudo: "+t);return o[g]?o(n):o.length>1?(i=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var i,r=o(t,n),s=r.length;s--;)t[i=c.call(t,r[s])]=!(e[i]=r[s])})):function(t){return o(t,0,i)}):o}},pseudos:{not:et((function(t){var e=[],n=[],i=gt(t.replace(P,"$1"));return i[g]?et((function(t,e,n,o){for(var r,s=i(t,null,o,[]),a=t.length;a--;)(r=s[a])&&(t[a]=!(e[a]=r))})):function(t,o,r){return e[0]=t,i(e,null,r,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return J(t,e).length>0}})),contains:et((function(t){return t=t.replace(U,V),function(e){return(e.textContent||x.text(e)).indexOf(t)>-1}})),lang:et((function(t){return B.test(t||"")||J.error("unsupported lang: "+t),t=t.replace(U,V).toLowerCase(),function(e){var n;do{if(n=f?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=i.location&&i.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===u},focus:function(t){return t===function(){try{return l.activeElement}catch(t){}}()&&l.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:rt(!1),disabled:rt(!0),checked:function(t){return O(t,"input")&&!!t.checked||O(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return Q.test(t.nodeName)},button:function(t){return O(t,"input")&&"button"===t.type||O(t,"button")},text:function(t){var e;return O(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:st((function(){return[0]})),last:st((function(t,e){return[e-1]})),eq:st((function(t,e,n){return[n<0?n+e:n]})),even:st((function(t,e){for(var n=0;ne?e:n;--i>=0;)t.push(i);return t})),gt:st((function(t,e,n){for(var i=n<0?n+e:n;++i1?function(e,n,i){for(var o=t.length;o--;)if(!t[o](e,n,i))return!1;return!0}:t[0]}function pt(t,e,n,i,o){for(var r,s=[],a=0,l=t.length,u=null!=e;a-1&&(r[u]=!(s[u]=d))}}else h=pt(h===s?h.splice(g,h.length):h),o?o(null,s,h,l):v.apply(s,h)}))}function mt(t){for(var i,o,r,s=t.length,a=e.relative[t[0].type],l=a||e.relative[" "],u=a?1:0,f=dt((function(t){return t===i}),l,!0),d=dt((function(t){return c.call(i,t)>-1}),l,!0),h=[function(t,e,o){var r=!a&&(o||e!=n)||((i=e).nodeType?f(t,e,o):d(t,e,o));return i=null,r}];u1&&ht(h),u>1&&ft(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(P,"$1"),o,u0,r=t.length>0,s=function(s,a,u,c,d){var h,p,m,g=0,b="0",w=s&&[],k=[],j=n,_=s||r&&e.find.TAG("*",d),$=y+=null==j?1:Math.random()||.1,C=_.length;for(d&&(n=a==l||a||d);b!==C&&null!=(h=_[b]);b++){if(r&&h){for(p=0,a||h.ownerDocument==l||(lt(h),u=!f);m=t[p++];)if(m(h,a||l,u)){v.call(c,h);break}d&&(y=$)}o&&((h=!m&&h)&&g--,s&&w.push(h))}if(g+=b,o&&b!==g){for(p=0;m=i[p++];)m(w,k,a,u);if(s){if(g>0)for(;b--;)w[b]||k[b]||(k[b]=T.call(c));k=pt(k)}v.apply(c,k),d&&!s&&k.length>0&&g+i.length>1&&x.uniqueSort(c)}return d&&(y=$,n=j),w};return o?et(s):s}(s,r)),a.selector=t}return a}function yt(t,n,i,o){var r,s,a,l,u,c="function"==typeof t&&t,d=!o&&ct(t=c.selector||t);if(i=i||[],1===d.length){if((s=d[0]=d[0].slice(0)).length>2&&"ID"===(a=s[0]).type&&9===n.nodeType&&f&&e.relative[s[1].type]){if(!(n=(e.find.ID(a.matches[0].replace(U,V),n)||[])[0]))return i;c&&(n=n.parentNode),t=t.slice(s.shift().value.length)}for(r=W.needsContext.test(t)?0:s.length;r--&&(a=s[r],!e.relative[l=a.type]);)if((u=e.find[l])&&(o=u(a.matches[0].replace(U,V),K.test(s[0].type)&&at(n.parentNode)||n))){if(s.splice(r,1),!(t=o.length&&ft(s)))return v.apply(i,o),i;break}}return(c||gt(t,d))(o,n,!f,i,!n||K.test(t)&&at(n.parentNode)||n),i}ut.prototype=e.filters=e.pseudos,e.setFilters=new ut,m.sortStable=g.split("").sort($).join("")===g,lt(),m.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(l.createElement("fieldset"))})),x.find=J,x.expr[":"]=x.expr.pseudos,x.unique=x.uniqueSort,J.compile=gt,J.select=yt,J.setDocument=lt,J.tokenize=ct,J.escape=x.escapeSelector,J.getText=x.text,J.isXML=x.isXMLDoc,J.selectors=x.expr,J.support=x.support,J.uniqueSort=x.uniqueSort}();var M=function(t,e,n){for(var i=[],o=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(o&&x(t).is(n))break;i.push(t)}return i},H=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},q=x.expr.match.needsContext,I=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function F(t,e,n){return g(e)?x.grep(t,(function(t,i){return!!e.call(t,i,t)!==n})):e.nodeType?x.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?x.grep(t,(function(t){return c.call(e,t)>-1!==n})):x.filter(e,t,n)}x.filter=function(t,e,n){var i=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===i.nodeType?x.find.matchesSelector(i,t)?[i]:[]:x.find.matches(t,x.grep(e,(function(t){return 1===t.nodeType})))},x.fn.extend({find:function(t){var e,n,i=this.length,o=this;if("string"!=typeof t)return this.pushStack(x(t).filter((function(){for(e=0;e1?x.uniqueSort(n):n},filter:function(t){return this.pushStack(F(this,t||[],!1))},not:function(t){return this.pushStack(F(this,t||[],!0))},is:function(t){return!!F(this,"string"==typeof t&&q.test(t)?x(t):t||[],!1).length}});var N,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(x.fn.init=function(t,e,n){var i,o;if(!t)return this;if(n=n||N,"string"==typeof t){if(!(i="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:B.exec(t))||!i[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(i[1]){if(e=e instanceof x?e[0]:e,x.merge(this,x.parseHTML(i[1],e&&e.nodeType?e.ownerDocument||e:b,!0)),I.test(i[1])&&x.isPlainObject(e))for(i in e)g(this[i])?this[i](e[i]):this.attr(i,e[i]);return this}return(o=b.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):g(t)?void 0!==n.ready?n.ready(t):t(x):x.makeArray(t,this)}).prototype=x.fn,N=x(b);var W=/^(?:parents|prev(?:Until|All))/,Q={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}x.fn.extend({has:function(t){var e=x(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&x.find.matchesSelector(n,t))){r.push(n);break}return this.pushStack(r.length>1?x.uniqueSort(r):r)},index:function(t){return t?"string"==typeof t?c.call(x(t),this[0]):c.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(x.uniqueSort(x.merge(this.get(),x(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),x.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return M(t,"parentNode")},parentsUntil:function(t,e,n){return M(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return M(t,"nextSibling")},prevAll:function(t){return M(t,"previousSibling")},nextUntil:function(t,e,n){return M(t,"nextSibling",n)},prevUntil:function(t,e,n){return M(t,"previousSibling",n)},siblings:function(t){return H((t.parentNode||{}).firstChild,t)},children:function(t){return H(t.firstChild)},contents:function(t){return null!=t.contentDocument&&s(t.contentDocument)?t.contentDocument:(O(t,"template")&&(t=t.content||t),x.merge([],t.childNodes))}},(function(t,e){x.fn[t]=function(n,i){var o=x.map(this,e,n);return"Until"!==t.slice(-5)&&(i=n),i&&"string"==typeof i&&(o=x.filter(i,o)),this.length>1&&(Q[t]||x.uniqueSort(o),W.test(t)&&o.reverse()),this.pushStack(o)}}));var Y=/[^\x20\t\r\n\f]+/g;function K(t){return t}function U(t){throw t}function V(t,e,n,i){var o;try{t&&g(o=t.promise)?o.call(t).done(e).fail(n):t&&g(o=t.then)?o.call(t,e,n):e.apply(void 0,[t].slice(i))}catch(t){n.apply(void 0,[t])}}x.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return x.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):x.extend({},t);var e,n,i,o,r=[],s=[],a=-1,l=function(){for(o=o||t.once,i=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)r.splice(n,1),n<=a&&a--})),this},has:function(t){return t?x.inArray(t,r)>-1:r.length>0},empty:function(){return r&&(r=[]),this},disable:function(){return o=s=[],r=n="",this},disabled:function(){return!r},lock:function(){return o=s=[],n||e||(r=n=""),this},locked:function(){return!!o},fireWith:function(t,n){return o||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||l()),this},fire:function(){return u.fireWith(this,arguments),this},fired:function(){return!!i}};return u},x.extend({Deferred:function(t){var e=[["notify","progress",x.Callbacks("memory"),x.Callbacks("memory"),2],["resolve","done",x.Callbacks("once memory"),x.Callbacks("once memory"),0,"resolved"],["reject","fail",x.Callbacks("once memory"),x.Callbacks("once memory"),1,"rejected"]],n="pending",o={state:function(){return n},always:function(){return r.done(arguments).fail(arguments),this},catch:function(t){return o.then(null,t)},pipe:function(){var t=arguments;return x.Deferred((function(n){x.each(e,(function(e,i){var o=g(t[i[4]])&&t[i[4]];r[i[1]]((function(){var t=o&&o.apply(this,arguments);t&&g(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[i[0]+"With"](this,o?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,o){var r=0;function s(t,e,n,o){return function(){var a=this,l=arguments,u=function(){var i,u;if(!(t=r&&(n!==U&&(a=void 0,l=[i]),e.rejectWith(a,l))}};t?c():(x.Deferred.getErrorHook?c.error=x.Deferred.getErrorHook():x.Deferred.getStackHook&&(c.error=x.Deferred.getStackHook()),i.setTimeout(c))}}return x.Deferred((function(i){e[0][3].add(s(0,i,g(o)?o:K,i.notifyWith)),e[1][3].add(s(0,i,g(t)?t:K)),e[2][3].add(s(0,i,g(n)?n:U))})).promise()},promise:function(t){return null!=t?x.extend(t,o):o}},r={};return x.each(e,(function(t,i){var s=i[2],a=i[5];o[i[1]]=s.add,a&&s.add((function(){n=a}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(i[3].fire),r[i[0]]=function(){return r[i[0]+"With"](this===r?void 0:this,arguments),this},r[i[0]+"With"]=s.fireWith})),o.promise(r),t&&t.call(r,r),r},when:function(t){var e=arguments.length,n=e,i=Array(n),o=a.call(arguments),r=x.Deferred(),s=function(t){return function(n){i[t]=this,o[t]=arguments.length>1?a.call(arguments):n,--e||r.resolveWith(i,o)}};if(e<=1&&(V(t,r.done(s(n)).resolve,r.reject,!e),"pending"===r.state()||g(o[n]&&o[n].then)))return r.then();for(;n--;)V(o[n],s(n),r.reject);return r.promise()}});var X=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;x.Deferred.exceptionHook=function(t,e){i.console&&i.console.warn&&t&&X.test(t.name)&&i.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},x.readyException=function(t){i.setTimeout((function(){throw t}))};var Z=x.Deferred();function J(){b.removeEventListener("DOMContentLoaded",J),i.removeEventListener("load",J),x.ready()}x.fn.ready=function(t){return Z.then(t).catch((function(t){x.readyException(t)})),this},x.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--x.readyWait:x.isReady)||(x.isReady=!0,!0!==t&&--x.readyWait>0||Z.resolveWith(b,[x]))}}),x.ready.then=Z.then,"complete"===b.readyState||"loading"!==b.readyState&&!b.documentElement.doScroll?i.setTimeout(x.ready):(b.addEventListener("DOMContentLoaded",J),i.addEventListener("load",J));var tt=function(t,e,n,i,o,r,s){var a=0,l=t.length,u=null==n;if("object"===j(n))for(a in o=!0,n)tt(t,e,a,n[a],!0,r,s);else if(void 0!==i&&(o=!0,g(i)||(s=!0),u&&(s?(e.call(t,i),e=null):(u=e,e=function(t,e,n){return u.call(x(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each((function(){lt.remove(this,t)}))}}),x.extend({queue:function(t,e,n){var i;if(t)return e=(e||"fx")+"queue",i=at.get(t,e),n&&(!i||Array.isArray(n)?i=at.access(t,e,x.makeArray(n)):i.push(n)),i||[]},dequeue:function(t,e){e=e||"fx";var n=x.queue(t,e),i=n.length,o=n.shift(),r=x._queueHooks(t,e);"inprogress"===o&&(o=n.shift(),i--),o&&("fx"===e&&n.unshift("inprogress"),delete r.stop,o.call(t,(function(){x.dequeue(t,e)}),r)),!i&&r&&r.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return at.get(t,n)||at.access(t,n,{empty:x.Callbacks("once memory").add((function(){at.remove(t,[e+"queue",n])}))})}}),x.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,Ot=/^$|^module$|\/(?:java|ecma)script/i;_t=b.createDocumentFragment().appendChild(b.createElement("div")),($t=b.createElement("input")).setAttribute("type","radio"),$t.setAttribute("checked","checked"),$t.setAttribute("name","t"),_t.appendChild($t),m.checkClone=_t.cloneNode(!0).cloneNode(!0).lastChild.checked,_t.innerHTML="",m.noCloneChecked=!!_t.cloneNode(!0).lastChild.defaultValue,_t.innerHTML="",m.option=!!_t.lastChild;var Tt={thead:[1,"","
                                    "],col:[2,"","
                                    "],tr:[2,"","
                                    "],td:[3,"","
                                    "],_default:[0,"",""]};function St(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&O(t,e)?x.merge([t],n):n}function Et(t,e){for(var n=0,i=t.length;n",""]);var zt=/<|&#?\w+;/;function Pt(t,e,n,i,o){for(var r,s,a,l,u,c,f=e.createDocumentFragment(),d=[],h=0,p=t.length;h-1)o&&o.push(r);else if(u=mt(r),s=St(f.appendChild(r),"script"),u&&Et(s),n)for(c=0;r=s[c++];)Ot.test(r.type||"")&&n.push(r);return f}var At=/^([^.]*)(?:\.(.+)|)/;function Rt(){return!0}function Dt(){return!1}function Lt(t,e,n,i,o,r){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(i=i||n,n=void 0),e)Lt(t,a,n,i,e[a],r);return t}if(null==i&&null==o?(o=n,i=n=void 0):null==o&&("string"==typeof n?(o=i,i=void 0):(o=i,i=n,n=void 0)),!1===o)o=Dt;else if(!o)return t;return 1===r&&(s=o,o=function(t){return x().off(t),s.apply(this,arguments)},o.guid=s.guid||(s.guid=x.guid++)),t.each((function(){x.event.add(this,e,o,i,n)}))}function Mt(t,e,n){n?(at.set(t,e,!1),x.event.add(t,e,{namespace:!1,handler:function(t){var n,i=at.get(this,e);if(1&t.isTrigger&&this[e]){if(i)(x.event.special[e]||{}).delegateType&&t.stopPropagation();else if(i=a.call(arguments),at.set(this,e,i),this[e](),n=at.get(this,e),at.set(this,e,!1),i!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else i&&(at.set(this,e,x.event.trigger(i[0],i.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=Rt)}})):void 0===at.get(t,e)&&x.event.add(t,e,Rt)}x.event={global:{},add:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.get(t);if(rt(t))for(n.handler&&(n=(r=n).handler,o=r.selector),o&&x.find.matchesSelector(vt,o),n.guid||(n.guid=x.guid++),(l=m.events)||(l=m.events=Object.create(null)),(s=m.handle)||(s=m.handle=function(e){return void 0!==x&&x.event.triggered!==e.type?x.event.dispatch.apply(t,arguments):void 0}),u=(e=(e||"").match(Y)||[""]).length;u--;)h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h&&(f=x.event.special[h]||{},h=(o?f.delegateType:f.bindType)||h,f=x.event.special[h]||{},c=x.extend({type:h,origType:v,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:p.join(".")},r),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,i,p,s)||t.addEventListener&&t.addEventListener(h,s)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),o?d.splice(d.delegateCount++,0,c):d.push(c),x.event.global[h]=!0)},remove:function(t,e,n,i,o){var r,s,a,l,u,c,f,d,h,p,v,m=at.hasData(t)&&at.get(t);if(m&&(l=m.events)){for(u=(e=(e||"").match(Y)||[""]).length;u--;)if(h=v=(a=At.exec(e[u])||[])[1],p=(a[2]||"").split(".").sort(),h){for(f=x.event.special[h]||{},d=l[h=(i?f.delegateType:f.bindType)||h]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=r=d.length;r--;)c=d[r],!o&&v!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||i&&i!==c.selector&&("**"!==i||!c.selector)||(d.splice(r,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(t,c));s&&!d.length&&(f.teardown&&!1!==f.teardown.call(t,p,m.handle)||x.removeEvent(t,h,m.handle),delete l[h])}else for(h in l)x.event.remove(t,h+e[u],n,i,!0);x.isEmptyObject(l)&&at.remove(t,"handle events")}},dispatch:function(t){var e,n,i,o,r,s,a=new Array(arguments.length),l=x.event.fix(t),u=(at.get(this,"events")||Object.create(null))[l.type]||[],c=x.event.special[l.type]||{};for(a[0]=l,e=1;e=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==t.type||!0!==u.disabled)){for(r=[],s={},n=0;n-1:x.find(o,this,null,[u]).length),s[o]&&r.push(i);r.length&&a.push({elem:u,handlers:r})}return u=this,l\s*$/g;function Ft(t,e){return O(t,"table")&&O(11!==e.nodeType?e:e.firstChild,"tr")&&x(t).children("tbody")[0]||t}function Nt(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function Bt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Wt(t,e){var n,i,o,r,s,a;if(1===e.nodeType){if(at.hasData(t)&&(a=at.get(t).events))for(o in at.remove(e,"handle events"),a)for(n=0,i=a[o].length;n1&&"string"==typeof p&&!m.checkClone&&qt.test(p))return t.each((function(o){var r=t.eq(o);v&&(e[0]=p.call(this,o,r.html())),Gt(r,e,n,i)}));if(d&&(r=(o=Pt(e,t[0].ownerDocument,!1,t,i)).firstChild,1===o.childNodes.length&&(o=r),r||i)){for(a=(s=x.map(St(o,"script"),Nt)).length;f0&&Et(s,!l&&St(t,"script")),a},cleanData:function(t){for(var e,n,i,o=x.event.special,r=0;void 0!==(n=t[r]);r++)if(rt(n)){if(e=n[at.expando]){if(e.events)for(i in e.events)o[i]?x.event.remove(n,i):x.removeEvent(n,i,e.handle);n[at.expando]=void 0}n[lt.expando]&&(n[lt.expando]=void 0)}}}),x.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?x.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ft(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Ft(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(x.cleanData(St(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return x.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,i=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!Ht.test(t)&&!Tt[(Ct.exec(t)||["",""])[1].toLowerCase()]){t=x.htmlPrefilter(t);try{for(;n=0&&(l+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-r-l-a-.5))||0),l+u}function ce(t,e,n){var i=Vt(t),o=(!m.boxSizingReliable()||n)&&"border-box"===x.css(t,"boxSizing",!1,i),r=o,s=Jt(t,e,i),a="offset"+e[0].toUpperCase()+e.slice(1);if(Kt.test(s)){if(!n)return s;s="auto"}return(!m.boxSizingReliable()&&o||!m.reliableTrDimensions()&&O(t,"tr")||"auto"===s||!parseFloat(s)&&"inline"===x.css(t,"display",!1,i))&&t.getClientRects().length&&(o="border-box"===x.css(t,"boxSizing",!1,i),(r=a in t)&&(s=t[a])),(s=parseFloat(s)||0)+ue(t,e,n||(o?"border":"content"),r,i,s)+"px"}function fe(t,e,n,i,o){return new fe.prototype.init(t,e,n,i,o)}x.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Jt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,i){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var o,r,s,a=ot(e),l=Ut.test(e),u=t.style;if(l||(e=oe(a)),s=x.cssHooks[e]||x.cssHooks[a],void 0===n)return s&&"get"in s&&void 0!==(o=s.get(t,!1,i))?o:u[e];"string"==(r=typeof n)&&(o=ht.exec(n))&&o[1]&&(n=bt(t,e,o),r="number"),null!=n&&n==n&&("number"!==r||l||(n+=o&&o[3]||(x.cssNumber[a]?"":"px")),m.clearCloneStyle||""!==n||0!==e.indexOf("background")||(u[e]="inherit"),s&&"set"in s&&void 0===(n=s.set(t,n,i))||(l?u.setProperty(e,n):u[e]=n))}},css:function(t,e,n,i){var o,r,s,a=ot(e);return Ut.test(e)||(e=oe(a)),(s=x.cssHooks[e]||x.cssHooks[a])&&"get"in s&&(o=s.get(t,!0,n)),void 0===o&&(o=Jt(t,e,i)),"normal"===o&&e in ae&&(o=ae[e]),""===n||n?(r=parseFloat(o),!0===n||isFinite(r)?r||0:o):o}}),x.each(["height","width"],(function(t,e){x.cssHooks[e]={get:function(t,n,i){if(n)return!re.test(x.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ce(t,e,i):Xt(t,se,(function(){return ce(t,e,i)}))},set:function(t,n,i){var o,r=Vt(t),s=!m.scrollboxSize()&&"absolute"===r.position,a=(s||i)&&"border-box"===x.css(t,"boxSizing",!1,r),l=i?ue(t,e,i,a,r):0;return a&&s&&(l-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(r[e])-ue(t,e,"border",!1,r)-.5)),l&&(o=ht.exec(n))&&"px"!==(o[3]||"px")&&(t.style[e]=n,n=x.css(t,e)),le(0,n,l)}}})),x.cssHooks.marginLeft=te(m.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Jt(t,"marginLeft"))||t.getBoundingClientRect().left-Xt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),x.each({margin:"",padding:"",border:"Width"},(function(t,e){x.cssHooks[t+e]={expand:function(n){for(var i=0,o={},r="string"==typeof n?n.split(" "):[n];i<4;i++)o[t+pt[i]+e]=r[i]||r[i-2]||r[0];return o}},"margin"!==t&&(x.cssHooks[t+e].set=le)})),x.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var i,o,r={},s=0;if(Array.isArray(e)){for(i=Vt(t),o=e.length;s1)}}),x.Tween=fe,fe.prototype={constructor:fe,init:function(t,e,n,i,o,r){this.elem=t,this.prop=n,this.easing=o||x.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=i,this.unit=r||(x.cssNumber[n]?"":"px")},cur:function(){var t=fe.propHooks[this.prop];return t&&t.get?t.get(this):fe.propHooks._default.get(this)},run:function(t){var e,n=fe.propHooks[this.prop];return this.options.duration?this.pos=e=x.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):fe.propHooks._default.set(this),this}},fe.prototype.init.prototype=fe.prototype,fe.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=x.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){x.fx.step[t.prop]?x.fx.step[t.prop](t):1!==t.elem.nodeType||!x.cssHooks[t.prop]&&null==t.elem.style[oe(t.prop)]?t.elem[t.prop]=t.now:x.style(t.elem,t.prop,t.now+t.unit)}}},fe.propHooks.scrollTop=fe.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},x.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},x.fx=fe.prototype.init,x.fx.step={};var de,he,pe=/^(?:toggle|show|hide)$/,ve=/queueHooks$/;function me(){he&&(!1===b.hidden&&i.requestAnimationFrame?i.requestAnimationFrame(me):i.setTimeout(me,x.fx.interval),x.fx.tick())}function ge(){return i.setTimeout((function(){de=void 0})),de=Date.now()}function ye(t,e){var n,i=0,o={height:t};for(e=e?1:0;i<4;i+=2-e)o["margin"+(n=pt[i])]=o["padding"+n]=t;return e&&(o.opacity=o.width=t),o}function be(t,e,n){for(var i,o=(we.tweeners[e]||[]).concat(we.tweeners["*"]),r=0,s=o.length;r1)},removeAttr:function(t){return this.each((function(){x.removeAttr(this,t)}))}}),x.extend({attr:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return void 0===t.getAttribute?x.prop(t,e,n):(1===r&&x.isXMLDoc(t)||(o=x.attrHooks[e.toLowerCase()]||(x.expr.match.bool.test(e)?ke:void 0)),void 0!==n?null===n?void x.removeAttr(t,e):o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:(t.setAttribute(e,n+""),n):o&&"get"in o&&null!==(i=o.get(t,e))?i:null==(i=x.find.attr(t,e))?void 0:i)},attrHooks:{type:{set:function(t,e){if(!m.radioValue&&"radio"===e&&O(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,i=0,o=e&&e.match(Y);if(o&&1===t.nodeType)for(;n=o[i++];)t.removeAttribute(n)}}),ke={set:function(t,e,n){return!1===e?x.removeAttr(t,n):t.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=je[e]||x.find.attr;je[e]=function(t,e,i){var o,r,s=e.toLowerCase();return i||(r=je[s],je[s]=o,o=null!=n(t,e,i)?s:null,je[s]=r),o}}));var _e=/^(?:input|select|textarea|button)$/i,$e=/^(?:a|area)$/i;function xe(t){return(t.match(Y)||[]).join(" ")}function Ce(t){return t.getAttribute&&t.getAttribute("class")||""}function Oe(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}x.fn.extend({prop:function(t,e){return tt(this,x.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[x.propFix[t]||t]}))}}),x.extend({prop:function(t,e,n){var i,o,r=t.nodeType;if(3!==r&&8!==r&&2!==r)return 1===r&&x.isXMLDoc(t)||(e=x.propFix[e]||e,o=x.propHooks[e]),void 0!==n?o&&"set"in o&&void 0!==(i=o.set(t,n,e))?i:t[e]=n:o&&"get"in o&&null!==(i=o.get(t,e))?i:t[e]},propHooks:{tabIndex:{get:function(t){var e=x.find.attr(t,"tabindex");return e?parseInt(e,10):_e.test(t.nodeName)||$e.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),m.optSelected||(x.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){x.propFix[this.toLowerCase()]=this})),x.fn.extend({addClass:function(t){var e,n,i,o,r,s;return g(t)?this.each((function(e){x(this).addClass(t.call(this,e,Ce(this)))})):(e=Oe(t)).length?this.each((function(){if(i=Ce(this),n=1===this.nodeType&&" "+xe(i)+" "){for(r=0;r-1;)n=n.replace(" "+o+" "," ");s=xe(n),i!==s&&this.setAttribute("class",s)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,i,o,r,s=typeof t,a="string"===s||Array.isArray(t);return g(t)?this.each((function(n){x(this).toggleClass(t.call(this,n,Ce(this),e),e)})):"boolean"==typeof e&&a?e?this.addClass(t):this.removeClass(t):(n=Oe(t),this.each((function(){if(a)for(r=x(this),o=0;o-1)return!0;return!1}});var Te=/\r/g;x.fn.extend({val:function(t){var e,n,i,o=this[0];return arguments.length?(i=g(t),this.each((function(n){var o;1===this.nodeType&&(null==(o=i?t.call(this,n,x(this).val()):t)?o="":"number"==typeof o?o+="":Array.isArray(o)&&(o=x.map(o,(function(t){return null==t?"":t+""}))),(e=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,o,"value")||(this.value=o))}))):o?(e=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(o,"value"))?n:"string"==typeof(n=o.value)?n.replace(Te,""):null==n?"":n:void 0}}),x.extend({valHooks:{option:{get:function(t){var e=x.find.attr(t,"value");return null!=e?e:xe(x.text(t))}},select:{get:function(t){var e,n,i,o=t.options,r=t.selectedIndex,s="select-one"===t.type,a=s?null:[],l=s?r+1:o.length;for(i=r<0?l:s?r:0;i-1)&&(n=!0);return n||(t.selectedIndex=-1),r}}}}),x.each(["radio","checkbox"],(function(){x.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=x.inArray(x(t).val(),e)>-1}},m.checkOn||(x.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Se=i.location,Ee={guid:Date.now()},ze=/\?/;x.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new i.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||x.error("Invalid XML: "+(n?x.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Pe=/^(?:focusinfocus|focusoutblur)$/,Ae=function(t){t.stopPropagation()};x.extend(x.event,{trigger:function(t,e,n,o){var r,s,a,l,u,c,f,d,p=[n||b],v=h.call(t,"type")?t.type:t,m=h.call(t,"namespace")?t.namespace.split("."):[];if(s=d=a=n=n||b,3!==n.nodeType&&8!==n.nodeType&&!Pe.test(v+x.event.triggered)&&(v.indexOf(".")>-1&&(m=v.split("."),v=m.shift(),m.sort()),u=v.indexOf(":")<0&&"on"+v,(t=t[x.expando]?t:new x.Event(v,"object"==typeof t&&t)).isTrigger=o?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:x.makeArray(e,[t]),f=x.event.special[v]||{},o||!f.trigger||!1!==f.trigger.apply(n,e))){if(!o&&!f.noBubble&&!y(n)){for(l=f.delegateType||v,Pe.test(l+v)||(s=s.parentNode);s;s=s.parentNode)p.push(s),a=s;a===(n.ownerDocument||b)&&p.push(a.defaultView||a.parentWindow||i)}for(r=0;(s=p[r++])&&!t.isPropagationStopped();)d=s,t.type=r>1?l:f.bindType||v,(c=(at.get(s,"events")||Object.create(null))[t.type]&&at.get(s,"handle"))&&c.apply(s,e),(c=u&&s[u])&&c.apply&&rt(s)&&(t.result=c.apply(s,e),!1===t.result&&t.preventDefault());return t.type=v,o||t.isDefaultPrevented()||f._default&&!1!==f._default.apply(p.pop(),e)||!rt(n)||u&&g(n[v])&&!y(n)&&((a=n[u])&&(n[u]=null),x.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,Ae),n[v](),t.isPropagationStopped()&&d.removeEventListener(v,Ae),x.event.triggered=void 0,a&&(n[u]=a)),t.result}},simulate:function(t,e,n){var i=x.extend(new x.Event,n,{type:t,isSimulated:!0});x.event.trigger(i,null,e)}}),x.fn.extend({trigger:function(t,e){return this.each((function(){x.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return x.event.trigger(t,e,n,!0)}});var Re=/\[\]$/,De=/\r?\n/g,Le=/^(?:submit|button|image|reset|file)$/i,Me=/^(?:input|select|textarea|keygen)/i;function He(t,e,n,i){var o;if(Array.isArray(e))x.each(e,(function(e,o){n||Re.test(t)?i(t,o):He(t+"["+("object"==typeof o&&null!=o?e:"")+"]",o,n,i)}));else if(n||"object"!==j(e))i(t,e);else for(o in e)He(t+"["+o+"]",e[o],n,i)}x.param=function(t,e){var n,i=[],o=function(t,e){var n=g(e)?e():e;i[i.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!x.isPlainObject(t))x.each(t,(function(){o(this.name,this.value)}));else for(n in t)He(n,t[n],e,o);return i.join("&")},x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=x.prop(this,"elements");return t?x.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!x(this).is(":disabled")&&Me.test(this.nodeName)&&!Le.test(t)&&(this.checked||!xt.test(t))})).map((function(t,e){var n=x(this).val();return null==n?null:Array.isArray(n)?x.map(n,(function(t){return{name:e.name,value:t.replace(De,"\r\n")}})):{name:e.name,value:n.replace(De,"\r\n")}})).get()}});var qe=/%20/g,Ie=/#.*$/,Fe=/([?&])_=[^&]*/,Ne=/^(.*?):[ \t]*([^\r\n]*)$/gm,Be=/^(?:GET|HEAD)$/,We=/^\/\//,Qe={},Ge={},Ye="*/".concat("*"),Ke=b.createElement("a");function Ue(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var i,o=0,r=e.toLowerCase().match(Y)||[];if(g(n))for(;i=r[o++];)"+"===i[0]?(i=i.slice(1)||"*",(t[i]=t[i]||[]).unshift(n)):(t[i]=t[i]||[]).push(n)}}function Ve(t,e,n,i){var o={},r=t===Ge;function s(a){var l;return o[a]=!0,x.each(t[a]||[],(function(t,a){var u=a(e,n,i);return"string"!=typeof u||r||o[u]?r?!(l=u):void 0:(e.dataTypes.unshift(u),s(u),!1)})),l}return s(e.dataTypes[0])||!o["*"]&&s("*")}function Xe(t,e){var n,i,o=x.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((o[n]?t:i||(i={}))[n]=e[n]);return i&&x.extend(!0,t,i),t}Ke.href=Se.href,x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Se.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Se.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Xe(Xe(t,x.ajaxSettings),e):Xe(x.ajaxSettings,t)},ajaxPrefilter:Ue(Qe),ajaxTransport:Ue(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,o,r,s,a,l,u,c,f,d,h=x.ajaxSetup({},e),p=h.context||h,v=h.context&&(p.nodeType||p.jquery)?x(p):x.event,m=x.Deferred(),g=x.Callbacks("once memory"),y=h.statusCode||{},w={},k={},j="canceled",_={readyState:0,getResponseHeader:function(t){var e;if(u){if(!s)for(s={};e=Ne.exec(r);)s[e[1].toLowerCase()+" "]=(s[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=s[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return u?r:null},setRequestHeader:function(t,e){return null==u&&(t=k[t.toLowerCase()]=k[t.toLowerCase()]||t,w[t]=e),this},overrideMimeType:function(t){return null==u&&(h.mimeType=t),this},statusCode:function(t){var e;if(t)if(u)_.always(t[_.status]);else for(e in t)y[e]=[y[e],t[e]];return this},abort:function(t){var e=t||j;return n&&n.abort(e),$(0,e),this}};if(m.promise(_),h.url=((t||h.url||Se.href)+"").replace(We,Se.protocol+"//"),h.type=e.method||e.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(Y)||[""],null==h.crossDomain){l=b.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Ke.protocol+"//"+Ke.host!=l.protocol+"//"+l.host}catch(t){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=x.param(h.data,h.traditional)),Ve(Qe,h,e,_),u)return _;for(f in(c=x.event&&h.global)&&0==x.active++&&x.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Be.test(h.type),o=h.url.replace(Ie,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qe,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(ze.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Fe,"$1"),d=(ze.test(o)?"&":"?")+"_="+Ee.guid+++d),h.url=o+d),h.ifModified&&(x.lastModified[o]&&_.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&_.setRequestHeader("If-None-Match",x.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||e.contentType)&&_.setRequestHeader("Content-Type",h.contentType),_.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Ye+"; q=0.01":""):h.accepts["*"]),h.headers)_.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(!1===h.beforeSend.call(p,_,h)||u))return _.abort();if(j="abort",g.add(h.complete),_.done(h.success),_.fail(h.error),n=Ve(Ge,h,e,_)){if(_.readyState=1,c&&v.trigger("ajaxSend",[_,h]),u)return _;h.async&&h.timeout>0&&(a=i.setTimeout((function(){_.abort("timeout")}),h.timeout));try{u=!1,n.send(w,$)}catch(t){if(u)throw t;$(-1,t)}}else $(-1,"No Transport");function $(t,e,s,l){var f,d,b,w,k,j=e;u||(u=!0,a&&i.clearTimeout(a),n=void 0,r=l||"",_.readyState=t>0?4:0,f=t>=200&&t<300||304===t,s&&(w=function(t,e,n){for(var i,o,r,s,a=t.contents,l=t.dataTypes;"*"===l[0];)l.shift(),void 0===i&&(i=t.mimeType||e.getResponseHeader("Content-Type"));if(i)for(o in a)if(a[o]&&a[o].test(i)){l.unshift(o);break}if(l[0]in n)r=l[0];else{for(o in n){if(!l[0]||t.converters[o+" "+l[0]]){r=o;break}s||(s=o)}r=r||s}if(r)return r!==l[0]&&l.unshift(r),n[r]}(h,_,s)),!f&&x.inArray("script",h.dataTypes)>-1&&x.inArray("json",h.dataTypes)<0&&(h.converters["text script"]=function(){}),w=function(t,e,n,i){var o,r,s,a,l,u={},c=t.dataTypes.slice();if(c[1])for(s in t.converters)u[s.toLowerCase()]=t.converters[s];for(r=c.shift();r;)if(t.responseFields[r]&&(n[t.responseFields[r]]=e),!l&&i&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),l=r,r=c.shift())if("*"===r)r=l;else if("*"!==l&&l!==r){if(!(s=u[l+" "+r]||u["* "+r]))for(o in u)if((a=o.split(" "))[1]===r&&(s=u[l+" "+a[0]]||u["* "+a[0]])){!0===s?s=u[o]:!0!==u[o]&&(r=a[0],c.unshift(a[1]));break}if(!0!==s)if(s&&t.throws)e=s(e);else try{e=s(e)}catch(t){return{state:"parsererror",error:s?t:"No conversion from "+l+" to "+r}}}return{state:"success",data:e}}(h,w,_,f),f?(h.ifModified&&((k=_.getResponseHeader("Last-Modified"))&&(x.lastModified[o]=k),(k=_.getResponseHeader("etag"))&&(x.etag[o]=k)),204===t||"HEAD"===h.type?j="nocontent":304===t?j="notmodified":(j=w.state,d=w.data,f=!(b=w.error))):(b=j,!t&&j||(j="error",t<0&&(t=0))),_.status=t,_.statusText=(e||j)+"",f?m.resolveWith(p,[d,j,_]):m.rejectWith(p,[_,j,b]),_.statusCode(y),y=void 0,c&&v.trigger(f?"ajaxSuccess":"ajaxError",[_,h,f?d:b]),g.fireWith(p,[_,j]),c&&(v.trigger("ajaxComplete",[_,h]),--x.active||x.event.trigger("ajaxStop")))}return _},getJSON:function(t,e,n){return x.get(t,e,n,"json")},getScript:function(t,e){return x.get(t,void 0,e,"script")}}),x.each(["get","post"],(function(t,e){x[e]=function(t,n,i,o){return g(n)&&(o=o||i,i=n,n=void 0),x.ajax(x.extend({url:t,type:e,dataType:o,data:n,success:i},x.isPlainObject(t)&&t))}})),x.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),x._evalUrl=function(t,e,n){return x.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){x.globalEval(t,e,n)}})},x.fn.extend({wrapAll:function(t){var e;return this[0]&&(g(t)&&(t=t.call(this[0])),e=x(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return g(t)?this.each((function(e){x(this).wrapInner(t.call(this,e))})):this.each((function(){var e=x(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=g(t);return this.each((function(n){x(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){x(this).replaceWith(this.childNodes)})),this}}),x.expr.pseudos.hidden=function(t){return!x.expr.pseudos.visible(t)},x.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},x.ajaxSettings.xhr=function(){try{return new i.XMLHttpRequest}catch(t){}};var Ze={0:200,1223:204},Je=x.ajaxSettings.xhr();m.cors=!!Je&&"withCredentials"in Je,m.ajax=Je=!!Je,x.ajaxTransport((function(t){var e,n;if(m.cors||Je&&!t.crossDomain)return{send:function(o,r){var s,a=t.xhr();if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(s in t.xhrFields)a[s]=t.xhrFields[s];for(s in t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||o["X-Requested-With"]||(o["X-Requested-With"]="XMLHttpRequest"),o)a.setRequestHeader(s,o[s]);e=function(t){return function(){e&&(e=n=a.onload=a.onerror=a.onabort=a.ontimeout=a.onreadystatechange=null,"abort"===t?a.abort():"error"===t?"number"!=typeof a.status?r(0,"error"):r(a.status,a.statusText):r(Ze[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=e(),n=a.onerror=a.ontimeout=e("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&i.setTimeout((function(){e&&n()}))},e=e("abort");try{a.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),x.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return x.globalEval(t),t}}}),x.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),x.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(i,o){e=x(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +

                                    ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                    + + +
                                    + + + + + +
                                    + + +
                                    + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/genindex.html b/stable/genindex.html new file mode 100644 index 000000000..2eb55b031 --- /dev/null +++ b/stable/genindex.html @@ -0,0 +1,631 @@ + + + + + + + + + + + + + Index | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + + + +
                                    + + + + + +
                                    + + +
                                    + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/index.html b/stable/index.html new file mode 100644 index 000000000..4263ae7ca --- /dev/null +++ b/stable/index.html @@ -0,0 +1,661 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    ScyllaDB Monitoring Stack

                                    +
                                    +
                                    +

                                    ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                    +_images/monitor.png +

                                    The ScyllaDB Monitoring Stack consists of three components, wrapped in Docker containers:

                                    +
                                      +
                                    • prometheus - collects and stores metrics

                                    • +
                                    • alertmanager - handles alerts

                                    • +
                                    • grafana - dashboard server

                                    • +
                                    +

                                    Choose a topic to get started:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/install/docker-compose.html b/stable/install/docker-compose.html new file mode 100644 index 000000000..a74302b81 --- /dev/null +++ b/stable/install/docker-compose.html @@ -0,0 +1,803 @@ + + + + + + + + + + + + + Using Docker Compose | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Using Docker Compose

                                    +

                                    Scylla-Monitoring Stack is container-based. +You can start and stop the Scylla Monitoring Stack with the start-all.sh and kill-all.sh scripts.

                                    +

                                    Docker Compose is an alternative method to start and stop the stack. It requires more manual steps, but once +configured, it simplifies starting and stopping the stack.

                                    +
                                    +

                                    Warning

                                    +

                                    docker-compose and start_all.sh are two alternative ways to launch Scylla Monitoring Stack. +You should use one method, not both. In particular, creating and updating docker-compose.yml is ignored +when using start_all.sh

                                    +
                                    +
                                    +

                                    Prerequisite

                                    +

                                    Make sure you have docker and docker-compose installed.

                                    +
                                    +
                                    +

                                    Setting Prometheus

                                    +

                                    The Prometheus configuration file contains among others the IP address of the alertmanager and either the location +of the scylla_server.yml file or a Consul IP address of Scylla Manager, if Scylla Manager is used for server provisioning.

                                    +

                                    You can use ./prometheus-config.sh to generate the file, for example:

                                    +
                                    ./prometheus-config.sh --compose
                                    +
                                    +
                                    +

                                    For production systems, It is advised to use an external directory for the Prometheus database. Make sure to create one and +update the docker-compose file accordingly (see the docker-compose example below).

                                    +
                                    +
                                    +

                                    Setting Grafana Provisioning

                                    +

                                    Grafana reads its provisioning configuration from files, one for the data-source and one for the dashboards. +Note that the latter tells Grafana where the dashboards are located, it is not the dashboards themselves, which are +at a different location.

                                    +
                                    +

                                    Grafana Data-Source file

                                    +

                                    Run the following command to update the datasource:

                                    +
                                    ./grafana-datasource.sh --compose
                                    +
                                    +
                                    +

                                    You can see the generated file under: grafana/provisioning/datasources/datasource.yaml

                                    +
                                    +
                                    +

                                    Grafana Dashboard Load file

                                    +

                                    To set the dashboard load file, you can run the ./generate-sashboards.sh with the -t command line flag and the -v flag to specify the version. +For example, Scylla-enterprise version 2020.1:

                                    +
                                    ./generate-dashboards.sh -t -v 2020.1
                                    +
                                    +
                                    +

                                    This command generates the files under: grafana/provisioning/dashboards/

                                    +
                                    +
                                    +
                                    +

                                    Docker Compose file

                                    +

                                    You can use the following example as a base for your docker compose.

                                    +

                                    Pass the following to a file called docker-compose.yml

                                    +
                                    services:
                                    +  alertmanager:
                                    +    container_name: aalert
                                    +    image: prom/alertmanager:v0.24.0
                                    +    ports:
                                    +    - 9093:9093
                                    +    volumes:
                                    +    - ./prometheus/rule_config.yml:/etc/alertmanager/config.yml
                                    +  grafana:
                                    +    container_name: agraf
                                    +    environment:
                                    +    - GF_PANELS_DISABLE_SANITIZE_HTML=true
                                    +    - GF_PATHS_PROVISIONING=/var/lib/grafana/provisioning
                                    +    - GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS=scylladb-scylla-datasource
                                    +    # This is where you set Grafana security
                                    +    - GF_AUTH_BASIC_ENABLED=false
                                    +    - GF_AUTH_ANONYMOUS_ENABLED=true
                                    +    - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
                                    +    - GF_SECURITY_ADMIN_PASSWORD=admin
                                    +    # To set your home dashboard uncomment the following line, set VERSION to be your current version
                                    +    #- GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH=/var/lib/grafana/dashboards/ver_VERSION/scylla-overview.VERSION.json
                                    +    image: grafana/grafana:9.3.11
                                    +    ports:
                                    +    - 3000:3000
                                    +    user: 1000:1000
                                    +    volumes:
                                    +    - ./grafana/build:/var/lib/grafana/dashboards
                                    +    - ./grafana/plugins:/var/lib/grafana/plugins
                                    +    - ./grafana/provisioning:/var/lib/grafana/provisioning
                                    +    # Uncomment the following line for grafana persistency
                                    +    # - path/to/grafana/dir:/var/lib/grafana
                                    +  loki:
                                    +    command:
                                    +    - --config.file=/mnt/config/loki-config.yaml
                                    +    container_name: loki
                                    +    image: grafana/loki:2.7.3
                                    +    ports:
                                    +    - 3100:3100
                                    +    volumes:
                                    +    - ./loki/rules:/etc/loki/rules
                                    +    - ./loki/conf:/mnt/config
                                    +  promotheus:
                                    +    command:
                                    +    - --config.file=/etc/prometheus/prometheus.yml
                                    +    container_name: aprom
                                    +    image: prom/prometheus:v2.42.0
                                    +    ports:
                                    +    - 9090:9090
                                    +    volumes:
                                    +    - ./prometheus/build/prometheus.yml:/etc/prometheus/prometheus.yml
                                    +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/scylla_servers.yml
                                    +    - ./prometheus/prom_rules/:/etc/prometheus/prom_rules/
                                    +    - ./prometheus/scylla_manager_servers.yml:/etc/scylla.d/prometheus/scylla_manager_servers.yml
                                    +    - ./prometheus/scylla_servers.yml:/etc/scylla.d/prometheus/node_exporter_servers.yml
                                    +    # Uncomment the following line for prometheus persistency 
                                    +    # - path/to/data/dir:/prometheus/data
                                    +  promtail:
                                    +    command:
                                    +    - --config.file=/etc/promtail/config.yml
                                    +    container_name: promtail
                                    +    image: grafana/promtail:2.7.3
                                    +    ports:
                                    +    - 1514:1514
                                    +    - 9080:9080
                                    +    volumes:
                                    +    - ./loki/promtail/promtail_config.compose.yml:/etc/promtail/config.yml
                                    +version: '3'
                                    +
                                    +
                                    +
                                    +

                                    Start and Stop

                                    +

                                    To start the Scylla Monitoring Stack run docker-compose up and to stop run docker-compose down.

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/install/docker_compose.html b/stable/install/docker_compose.html new file mode 100644 index 000000000..027ff2919 --- /dev/null +++ b/stable/install/docker_compose.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/install/index.html b/stable/install/index.html new file mode 100644 index 000000000..f8c1064b9 --- /dev/null +++ b/stable/install/index.html @@ -0,0 +1,660 @@ + + + + + + + + + + + + + Download and Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Download and Install Scylla Monitoring Stack

                                    +
                                    +
                                    +

                                    Scylla Monitoring Stack is a full stack for Scylla monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom Scylla dashboards and tooling.

                                    +

                                    Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/install/min-prod-hw.html b/stable/install/min-prod-hw.html new file mode 100644 index 000000000..b35652f8c --- /dev/null +++ b/stable/install/min-prod-hw.html @@ -0,0 +1,730 @@ + + + + + + + + + + + + + Minimal Production System Recommendations | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Minimal Production System Recommendations

                                    +
                                      +
                                    • CPU - at least 2 physical cores/ 4vCPUs

                                    • +
                                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                                    • +
                                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                    • +
                                    • Network - 1GbE/10GbE preferred

                                    • +
                                    +
                                    +

                                    Calculating Prometheus Minimal Disk Space requirement

                                    +

                                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                    +

                                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                    +

                                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                    +
                                    6 * 16 * 15 * 12MB ~ 16GB
                                    +
                                    +
                                    +

                                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                    +
                                    +
                                    +

                                    Calculating Prometheus Minimal Memory Space requirement

                                    +

                                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                    +

                                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                    + +
                                    + +++++++ + + + +
                                    # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                    00
                                    + +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/install/monitor-without-docker.html b/stable/install/monitor-without-docker.html new file mode 100644 index 000000000..b93318d04 --- /dev/null +++ b/stable/install/monitor-without-docker.html @@ -0,0 +1,1146 @@ + + + + + + + + + + + + + Deploying Scylla Monitoring Stack Without Docker | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Deploying Scylla Monitoring Stack Without Docker

                                    +
                                    +

                                    Introduction

                                    +

                                    The following instructions will help to deploy Scylla Monitoring Stack in cases where you can not use the recommended Docker version.

                                    +

                                    Please note, Scylla recommends you use the Docker version as it will provide you with most updated, current Scylla Monitoring system.

                                    +

                                    Scylla Monitoring uses the following components:

                                    +
                                      +
                                    • Alertmanager

                                    • +
                                    • Grafana Loki

                                    • +
                                    • Prometheus

                                    • +
                                    • Grafana

                                    • +
                                    +

                                    The common scenario for users who use their own standalone installation, is that they already have such a server and would like to consolidate. +We assume that that you already have Prometheus and Grafana running but we will add minimal installation instruction for all components.

                                    +

                                    We suggest that you follow the installation instruction of each of those products from their official documentation. It is also recommended that all servers will run as a service.

                                    +
                                    +
                                    +

                                    Minimal Production System Recommendations

                                    +
                                      +
                                    • CPU - at least 2 physical cores/ 4vCPUs

                                    • +
                                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                                    • +
                                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                    • +
                                    • Network - 1GbE/10GbE preferred

                                    • +
                                    +
                                    +

                                    Calculating Prometheus Minimal Disk Space requirement

                                    +

                                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                    +

                                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                    +

                                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                    +
                                    6 * 16 * 15 * 12MB ~ 16GB
                                    +
                                    +
                                    +

                                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                    +
                                    +
                                    +

                                    Calculating Prometheus Minimal Memory Space requirement

                                    +

                                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                    +

                                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                    + +
                                    + +++++++ + + + +
                                    # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                    00
                                    + +
                                    +

                                    The main item to set an alert on is the available disk space in the monitoring system. Data is indefinitely accrued on the Prometheus data directory. +The current monitoring solution does not churn data.

                                    +
                                    +

                                    Note

                                    +

                                    Confirm before installing, that your Grafana and Prometheus versions are supported by the Scylla Monitoring Stack version you want to install. Scylla-Monitoring follows the latest Prometheus and Grafana releases tightly. See the Scylla Monitoring Stack Compatibility Matrix.

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Install Scylla Monitoring Stack

                                    +

                                    The following procedure uses a CentOS 7 based instance

                                    +
                                      +
                                    1. Download the latest Scylla Monitoring Stack release.

                                    2. +
                                    +
                                    wget https://github.com/scylladb/scylla-monitoring/archive/refs/tags/scylla-monitoring-4.6.0.tar.gz
                                    +
                                    +
                                    +
                                      +
                                    1. Open the tar

                                    2. +
                                    +

                                    tar -xvf scylla-monitoring-*.tar.gz

                                    +
                                    +
                                    +

                                    Install Alertmanager

                                    +

                                    Tested with alertmanager 0.22.2 version

                                    +
                                      +
                                    1. Install alertmanager

                                    2. +
                                    +
                                    wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
                                    +tar -xvf alertmanager-*.linux-amd64.tar.gz
                                    +
                                    +
                                    +
                                      +
                                    1. Copy the following file: rule_config.yml from prometheus/ directory to alertmanager.yml in the alertmanager installation directory.

                                    2. +
                                    +

                                    For example:

                                    +
                                    cp -p /home/centos/scylla-monitoring-scylla-monitoring-4.6.0/prometheus/rule_config.yml alertmanager-0.22.2.linux-amd64/alertmanager.yml
                                    +
                                    +
                                    +
                                      +
                                    1. Start the Alertmanager

                                    2. +
                                    +

                                    For example:

                                    +
                                    cd alertmanager-0.22.2.linux-amd64
                                    +./alertmanager
                                    +
                                    +
                                    +
                                      +
                                    1. Verify that Alertmanager is up and running, point your browser to the Alertmanager IP:Port

                                    2. +
                                    +

                                    For example:

                                    +
                                    http://192.168.135.166:9093/
                                    +
                                    +
                                    +../_images/alertmanager.png +
                                    +
                                    +

                                    Install Grafana Loki

                                    +

                                    Loki is a log aggregation system inspired by Prometheus. Scylla Monitoring uses Loki for alerts and metrics generation. It does not replaces your centralized logging server, but it can, check +Loki-Grafana documentation if you want to use it for centralized log collection.

                                    +

                                    We recomand using Loki with containers, but you can install it locally as described in Loki installation

                                    +

                                    You will need to run both Loki and Promtail. Loki responsible for log parsing and acts as a Grafana and Proemtheus data-source and Generate alerts that are sent to the Alertmanager.

                                    +

                                    Promtail load logs into Loki, there are multiple ways of doing that, we suggest to use of rsyslog, this way you can add Promtail (and Loki) as a second log collection server.

                                    +

                                    Loki Related files

                                    +

                                    Loki has a configuration file and a rule file. You need to copy and modify the configuration.

                                    +
                                    mkdir -p /etc/loki/rules
                                    +mkdir -p /etc/loki/config
                                    +cp loki/rules/* /etc/loki/rules
                                    +cp loki/conf/loki-config.template.yaml /etc/loki/config/loki-config.yaml
                                    +
                                    +
                                    +

                                    Edit /etc/loki/config/loki-config.yaml and replace ALERTMANAGER with the alertmanager ip:port (i.e. localhost:9093)

                                    +

                                    Promtail Related files

                                    +

                                    Promtail has a configuration file. You need to copy and modify the configuration.

                                    +
                                    mkdir -p /etc/promtail/
                                    +loki/promtail/promtail_config.template.yml /etc/promtail/config.yml
                                    +
                                    +
                                    +

                                    Edit /etc/promtail/config.yml and replace LOKI_IP with Loki’s ip:port (i.e. localhost:3100)

                                    +
                                    +
                                    +

                                    Install Prometheus

                                    +

                                    Tested with Prometheus version 2.27.1

                                    +
                                    +

                                    Note

                                    +

                                    If you already have a prometheus server, beside the expected scrap jobs, make sure you take the Prometheus rules directory. +The files not only contains important alerts, they are containing recording rules, without it different asspects of the dashboards will not work.

                                    +
                                    +
                                      +
                                    1. Install Prometheus

                                    2. +
                                    +
                                    wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz
                                    +tar -xvf prometheus-*.linux-amd64.tar.gz
                                    +
                                    +
                                    +

                                    2. Create Data and Config directories +.. code-block:: shell

                                    +
                                    +

                                    mkdir -p /prometheus/data +mkdir -p /etc/prometheus/prom_rules/ +mkdir -p /etc/scylla.d/prometheus/

                                    +
                                    +
                                      +
                                    1. Copy the following files: scylla_servers.yml, prometheus.rules.yml from prometheus/ directory to Prometheus installation directory.

                                    2. +
                                    +

                                    Copy prometheus/prometheus.yml.template to prometheus.yml

                                    +

                                    For example:

                                    +
                                    cp scylla-monitoring-scylla-monitoring-4.6.0/prometheus/prom_rules/*.yml /etc/prometheus/prom_rules/
                                    +cp scylla-monitoring-scylla-monitoring-4.6.0/prometheus/prometheus.yml.template /etc/prometheus/prometheus.yml
                                    +
                                    +
                                    +
                                      +
                                    1. Edit the prometheus.yml file to point to the correct static data sources.

                                    2. +
                                    +
                                    +

                                    Note

                                    +

                                    Make sure to include the honor_labels: false parameter in the prometheus.yml file.

                                    +
                                    +
                                    vi /etc/prometheus/prometheus.yml
                                    +
                                    +
                                    +

                                    Set the alertmanger address and port by replacing AM_ADDRESS in the file.

                                    +

                                    For example if the alertmanager will run on the same host:

                                    +
                                    alerting:
                                    +   alertmanagers:
                                    +   - static_configs:
                                    +       - targets:
                                    +           - 127.0.0.1:9093
                                    +
                                    +
                                    +

                                    Replace the files in to point to the right local file, typically for scylla, node_exporter and manager_agent you can use the same file (scylla_servers.yml).

                                    +

                                    For example the scrape config for Scylla:

                                    +
                                    global:
                                    +  scrape_interval: 5s # By default, scrape targets every 5 second.
                                    +  scrape_timeout: 4s # Timeout before trying to scape a target again
                                    +
                                    +  # Attach these labels to any time series or alerts when communicating with
                                    +  # external systems (federation, remote storage, Alertmanager).
                                    +  external_labels:
                                    +    monitor: 'scylla-monitor'
                                    +
                                    +scrape_configs:
                                    +- job_name: scylla
                                    +  honor_labels: false
                                    +  file_sd_configs:
                                    +    - files:
                                    +      - /etc/scylla.d/prometheus/scylla_servers.yml
                                    +  relabel_configs:
                                    +    - source_labels: [__address__]
                                    +      regex:  '([^:]+)'
                                    +      target_label: __address__
                                    +      replacement: '${1}:9180'
                                    +
                                    +    - source_labels: [__address__]
                                    +      regex:  '(.*):.+'
                                    +      target_label: instance
                                    +      replacement: '${1}'
                                    +
                                    +
                                    +
                                      +
                                    1. Create and set scylla_servers.yml file point to your Scylla nodes and scylla_manager_server.yml file to point to your Scylla Manager.

                                    2. +
                                    +
                                    +

                                    Note

                                    +

                                    There is no need to configure node_exporter_server. Instead, in the Prometheus scrape config of the node_exporter +you can use the same file you used for Scylla and Prometheus will assume you have a node_exporter running on each Scylla server.

                                    +
                                    +

                                    An example for those files can be found under the Prometheus directory: prometheus/scylla_servers.example.yml and prometheus/scylla_manager_servers.example.yml

                                    +
                                    +

                                    Note

                                    +

                                    You must have both files even if you are not using Scylla Manager

                                    +
                                    +

                                    Add the labels for the cluster and data-center

                                    +

                                    scylla_servers.yml:

                                    +

                                    For example:

                                    +
                                    cat scylla_servers.yml
                                    +# List Scylla end points
                                    +
                                    +- targets:
                                    +  - 192.168.66.6
                                    +  - 192.168.66.244
                                    +  labels:
                                    +    cluster: cluster1
                                    +    dc: dc1
                                    +- targets:
                                    +    - 172.17.0.3
                                    +  labels:
                                    +    cluster: cluster1
                                    +    dc: dc2
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    See the previous note about deprecating the node_exporter_servers.yml file.

                                    +
                                    +

                                    scylla_manager_server.yml

                                    +

                                    For example:

                                    +
                                    - targets:
                                    +  - 127.0.0.1:5090
                                    +
                                    +
                                    +
                                      +
                                    1. Start Prometheus server:

                                    2. +
                                    +

                                    For example:

                                    +
                                    cd scylla-monitoring-scylla-monitoring-4.6.0/
                                    +./prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path /prometheus/data
                                    +
                                    +
                                    +

                                    Data should start accumulate on: /prometheus/data

                                    +
                                      +
                                    1. Verify that Prometheus is up and running, point your browser to the Prometheus IP:Port

                                    2. +
                                    +

                                    For example:

                                    +
                                    http://192.168.135.166:9090/
                                    +
                                    +
                                    +../_images/1.png +

                                    Prometheus console should be visible

                                    +
                                      +
                                    1. Verify that the node_exporter and scylla metrics accumulating in the server by executing a query through the console

                                    2. +
                                    +

                                    For example:

                                    +

                                    node_memory_MemFree

                                    +../_images/2.png +

                                    And

                                    +

                                    scylla_reactor_utilization

                                    +../_images/3.png +

                                    At this point Scylla is emitting the metrics and Prometheus is able to store them.

                                    +
                                    +
                                    +

                                    Install Grafana

                                    +

                                    Tested with Grafna 7.5.7

                                    +
                                      +
                                    1. Install Grafana based on the instructions here

                                    2. +
                                    +

                                    Depends if you installed Grafana from a repository (yum install), or if you downloaded the zip version, the directory structure will be +different in the rest of the steps.

                                    +
                                      +
                                    1. Access Scylla-Grafana-monitoring directory

                                    2. +
                                    +
                                    cd scylla-monitoring-scylla-monitoring-4.6.0/
                                    +
                                    +
                                    +
                                      +
                                    1. Copy the plugins to the grafana plugins directory (by default /var/lib/grafana/)

                                    2. +
                                    +
                                    sudo cp -r grafana/plugins /var/lib/grafana/
                                    +
                                    +
                                    +

                                    If you installed Grafana from packages, instead of /var/lib/grafana/ you should copy it to public/app inside the directory you +opened Grafana in.

                                    +

                                    For example:

                                    +
                                    cp -r grafana/plugins ../grafana-7.5.7/public/app
                                    +
                                    +
                                    +
                                      +
                                    1. Provision the Dashboards

                                    2. +
                                    +

                                    For example Scylla Open-source version 4.5 and Scylla manager version 2.4

                                    +

                                    For Grafana installed with yum install

                                    +
                                    sudo cp grafana/load.yaml /etc/grafana/provisioning/dashboards/
                                    +sudo mkdir -p /var/lib/grafana/dashboards
                                    +sudo cp -r grafana/build/* /var/lib/grafana/dashboards
                                    +
                                    +
                                    +

                                    For Grafana installed from packages

                                    +
                                    cp -p -r grafana/build/* ../grafana-7.5.7/public/build/
                                    +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.4.5.yaml
                                    +cp -p grafana/load.yaml ../grafana-7.5.7/conf/provisioning/dashboards/load.manager_2.4.yaml
                                    +
                                    +
                                    +

                                    Edit the load.* files in /home/centos/grafana-7.5.7/conf/provisioning/dashboards/ for the correct path, +for example load.4.5.yaml would point to: /home/centos/grafana-7.5.7/public/build/ver_4.5.

                                    +
                                    +

                                    Note

                                    +

                                    A note about using folders, if you provision multiple Scylla versions, use the version as a folder name. Otherwise, no need to configure a FOLDER.

                                    +
                                    +
                                      +
                                    1. Set the data source by copy datasource.yml and edit it

                                    2. +
                                    +
                                    sudo cp grafana/datasource.yml /etc/grafana/provisioning/datasources/
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    Scylla uses a plugin to read from some system tables see the section below about using it.

                                    +
                                    +

                                    For Grafana installed from packages

                                    +
                                    cp -p grafana/datasource.yml /home/centos/grafana-7.5.7/conf/provisioning/datasources/
                                    +
                                    +
                                    +

                                    You should set the Prometheus and the alertmanager IP and port.

                                    +

                                    For example

                                    +
                                    sudo cat /etc/grafana/provisioning/datasources/datasource.yml
                                    +apiVersion: 1
                                    +datasources:
                                    + - name: prometheus
                                    +   type: prometheus
                                    +   url: http://192.168.135.167:9090
                                    +   access: proxy
                                    +   basicAuth: false
                                    +
                                    + - name: alertmanager
                                    +   type: camptocamp-prometheus-alertmanager-datasource
                                    +   orgId: 1
                                    +   typeLogoUrl: public/img/icn-datasource.svg
                                    +   access: proxy
                                    +   url: http://192.168.135.166:9093
                                    +   password:
                                    +   user:
                                    +   database:
                                    +   basicAuth:
                                    +   isDefault:
                                    +   jsonData:
                                    +     severity_critical: '4'
                                    +     severity_high: '3'
                                    +     severity_warning: '2'
                                    +     severity_info: '1'
                                    +
                                    +
                                    +
                                      +
                                    1. Start the Grafana service

                                    2. +
                                    +

                                    For Grafana installed with yum install

                                    +

                                    sudo service grafana-server start

                                    +

                                    For Grafana installed from packages:

                                    +

                                    cp -p /home/centos/grafana-7.5.7/conf/sample.ini /home/centos/grafana-7.5.7/conf/scylla.ini

                                    +

                                    Edit scylla.ini to reflect the right paths in the paths section of the file.

                                    +
                                    plugins = /home/centos/grafana-7.5.7/data/plugins
                                    +provisioning = /home/centos/grafana-7.5.7/conf/provisioning
                                    +
                                    +
                                    +

                                    Start the server:

                                    +
                                    cd /home/centos/grafana-7.5.7/
                                    +./bin/grafana-server -config /home/centos/grafana-7.5.7/conf/scylla.ini
                                    +
                                    +
                                    +
                                      +
                                    1. Make sure Grafana is running

                                    2. +
                                    +

                                    Point your browser to the Grafana server port 3000, the assumption is that Grafana and Prometheus are collocated on the same server.

                                    +../_images/grafana.png +
                                    +
                                    +

                                    Using Scylla Plugin with Grafana

                                    +

                                    Scylla Monitoring uses a plugin to read from some of the System tables. For the plugin to work it needs to be installed, configured and there should be a CQL connectivity between the Scylla Monitoring and the Scylla servers.

                                    +

                                    Because the plugin gives access to the Scylla tables, we strongly encourage you to add a user with read-only access restricted to the system keyspace and configure the plugin to use that user.

                                    +
                                    +

                                    Setting a monitoring user

                                    +

                                    This part is optional, but is highly recommended. The instruction at enable authorization covers all the following items in details.

                                    +
                                      +
                                    • If you have not done so, enable authorization first.

                                    • +
                                    • Add a new ROLL for the scylla monitoring: CREATE ROLE scylla_monitoring WITH PASSWORD = 'scylla_monitoring' AND LOGIN = true; make sure to give it a proper password.

                                    • +
                                    • Add SELECT permissions to the new user: GRANT SELECT on KEYSPACE system TO scylla_monitoring;

                                    • +
                                    +
                                    +
                                    +

                                    Installing the Plugin

                                    +

                                    Grafana reads plugins from its plugin directory, copy Scylla Plugin from  ‘grafana/plugins/scylla-datasource’ as described in the Grafana installation section.

                                    +
                                    +
                                    +

                                    Configure the Plugin

                                    +

                                    Add an entry to the datasource.yml file

                                    +
                                    - name: scylla-datasource
                                    +  type: scylladb-scylla-datasource
                                    +  orgId: 1
                                    +  isDefault:
                                    +  jsonData:
                                    +  host: ''
                                    +#  secureJsonData:
                                    +#    user: 'scylla_monitoring'
                                    +#    password: 'scylla_monitoring'
                                    +
                                    +
                                    +

                                    As mentioned previously it is safer to use a dedicated user/password for the monitoring with limited access privileges. Un-comment the relevant section if you do so, note that the username/password are only visible in the file.

                                    +
                                    +
                                    +

                                    Enable the Plugin

                                    +

                                    Grafana will not load unsigned plugins, for that you will need to enable it with Grafana. Edit Grafana grafana.ini file and add +the line allow_loading_unsigned_plugins: scylladb-scylla-datasource.

                                    +

                                    See more about it the Grafana configuration.

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/install/monitor_without_docker.html b/stable/install/monitor_without_docker.html new file mode 100644 index 000000000..c668ac5a7 --- /dev/null +++ b/stable/install/monitor_without_docker.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/install/monitoring-stack.html b/stable/install/monitoring-stack.html new file mode 100644 index 000000000..ac9507d79 --- /dev/null +++ b/stable/install/monitoring-stack.html @@ -0,0 +1,1093 @@ + + + + + + + + + + + + + Install Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Install Scylla Monitoring Stack

                                    +

                                    This document describes the setup of Scylla Monitoring Stack, based on Prometheus API.

                                    +

                                    The Scylla Monitoring Stack needs to be installed on a dedicated server, external to the Scylla cluster. Make sure the Scylla Monitoring Stack server has access to the Scylla nodes so that it can pull the metrics over the Prometheus API.

                                    +

                                    For evaluation, you can run Scylla Monitoring Stack on any server (or laptop) that can handle three Docker instances at the same time. For production, see recommendations below.

                                    +
                                    +

                                    Minimal Production System Recommendations

                                    +
                                      +
                                    • CPU - at least 2 physical cores/ 4vCPUs

                                    • +
                                    • Memory - 15GB+ DRAM and proportional to the number of cores.

                                    • +
                                    • Disk - persistent disk storage is proportional to the number of cores and Prometheus retention period (see the following section)

                                    • +
                                    • Network - 1GbE/10GbE preferred

                                    • +
                                    +
                                    +

                                    Calculating Prometheus Minimal Disk Space requirement

                                    +

                                    Prometheus storage disk performance requirements: persistent block volume, for example an EC2 EBS volume

                                    +

                                    Prometheus storage disk volume requirement: proportional to the number of metrics it holds. The default retention period is 15 days, and the disk requirement is around 12MB per core per day, assuming the default scraping interval of 20s.

                                    +

                                    For example, when monitoring a 6 node Scylla cluster, each with 16 CPU cores (so a total of 96 cores), and using the default 15 days retention time, you will need minimal disk space for prometheus of

                                    +
                                    6 * 16 * 15 * 12MB ~ 16GB
                                    +
                                    +
                                    +

                                    To account for unexpected events, like replacing or adding nodes, we recommend allocating at least x2-3 space, in this case, ~50GB. +Prometheus Storage disk does not have to be as fast as Scylla disk, and EC2 EBS, for example, is fast enough and provides HA out of the box.

                                    +
                                    +
                                    +

                                    Calculating Prometheus Minimal Memory Space requirement

                                    +

                                    Prometheus uses more memory when querying over a longer duration (e.g. looking at a dashboard on a week view would take more memory than on an hourly duration).

                                    +

                                    For Prometheus alone, you should have 60MB of memory per core in the cluster and it would use about 600MB of virtual memory per core. +Because Prometheus is so memory demanding, it is a good idea to add swap, so queries with a longer duration would not crash the server.

                                    + +
                                    + +++++++ + + + +
                                    # ScyllaDB Nodes# Cores Per ScyllaDB NodePrometheus Retention in DaysPrometheus RAMPrometheus Storage
                                    00
                                    + +
                                    +
                                    +
                                    +
                                    +

                                    Prerequisites

                                    +
                                      +
                                    • Follow the Installation Guide and install docker on the Scylla Monitoring Stack Server. This server can be the same server that is running Scylla Manager. Alternatively, you can Deploy Scylla Monitoring Stack Without Docker.

                                    • +
                                    • If you have Prometheus or Grafana installed, confirm that your version is supported by the Scylla Monitoring Stack version you want to install. Refer to the table below.

                                    • +
                                    + + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    Scylla Monitoring Stack Compatibility Matrix

                                    Scylla Monitoring Stack Version

                                    Prometheus Version

                                    Grafana Version

                                    4.6

                                    2.48.1

                                    10.2.2

                                    4.5

                                    2.47.1

                                    10.1.5

                                    4.4

                                    2.44.0

                                    9.5.2

                                    4.3

                                    2.42.0

                                    9.3.8

                                    4.2

                                    2.41.0

                                    9.3.4

                                    4.1

                                    2.38.0

                                    9.1.0

                                    4.0

                                    2.34.0

                                    8.5.2

                                    3.11

                                    2.32.0

                                    8.3.4

                                    3.10

                                    2.32.0

                                    8.3.3

                                    3.9.2

                                    2.29.1

                                    8.2.7

                                    3.9

                                    2.29.1

                                    8.1.1

                                    3.8

                                    2.27.1

                                    7.5.7

                                    3.7

                                    2.25.2

                                    7.4.0

                                    3.6

                                    2.18.1

                                    7.3.5

                                    3.5

                                    2.18.1

                                    7.1.5

                                    3.4

                                    2.18.1

                                    6.7.3

                                    +
                                    +
                                    +

                                    Docker Post Installation

                                    +

                                    Docker post installation guide can be found here

                                    +
                                    +

                                    Note

                                    +

                                    Avoid running the container as root.

                                    +
                                    +

                                    To avoid running docker as root, you should add the user you are going to use for Scylla Monitoring Stack to the Docker group.

                                    +
                                      +
                                    1. Create the Docker group.

                                    2. +
                                    +
                                    sudo groupadd docker
                                    +
                                    +
                                    +
                                      +
                                    1. Add your user to the docker group. Log out and log in again. The new group will be active for this user on next login.

                                    2. +
                                    +
                                    sudo usermod -aG docker $USER
                                    +
                                    +
                                    +
                                      +
                                    1. Start Docker by calling:

                                    2. +
                                    +
                                    sudo systemctl enable docker
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Install Scylla Monitoring Stack

                                    +

                                    Procedure

                                    +
                                      +
                                    1. Download and extract the latest Scylla Monitoring Stack binary;.

                                    2. +
                                    +
                                    wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.6.0.tar.gz
                                    +tar -xvf scylla-monitoring-4.6.0.tar.gz
                                    +cd scylla-monitoring-scylla-monitoring-4.6.0
                                    +
                                    +
                                    +

                                    As an alternative, you can clone and use the Git repository directly.

                                    +
                                    git clone https://github.com/scylladb/scylla-monitoring.git
                                    +cd scylla-monitoring
                                    +git checkout branch-4.6
                                    +
                                    +
                                    +
                                      +
                                    1. Start Docker service if needed

                                    2. +
                                    +
                                    sudo systemctl restart docker
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Configure Scylla Monitoring Stack

                                    +

                                    To monitor the cluster, Scylla Monitoring Stack (Specifically the Prometheus Server) needs to know the IP of all the nodes and the IP of the Scylla Manager Server (if you are using Scylla Manager).

                                    +

                                    This configuration can be done from files, or using the Consul api.

                                    +

                                    Scylla Manager 2.0 and higher supports the Consul API.

                                    +
                                    +

                                    Configure Scylla nodes from files

                                    +
                                      +
                                    1. Create prometheus/scylla_servers.yml with the targets’ IPs (the servers you wish to monitor).

                                    2. +
                                    +
                                    +

                                    Note

                                    +

                                    It is important that the name listed in dc in the labels matches the datacenter names used by Scylla. +Use the nodetool status command to validate the datacenter names used by Scylla.

                                    +
                                    +

                                    For example:

                                    +
                                    - targets:
                                    +      - 172.17.0.2
                                    +      - 172.17.0.3
                                    +  labels:
                                    +      cluster: cluster1
                                    +      dc: dc1
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    If you want to add your managed cluster to Scylla Monitoring Stack, add the IPs of the nodes as well as the cluster name you used when you added the cluster to Scylla Manager. It is important that the label cluster name and the cluster name in Scylla Manager match.

                                    +
                                    +

                                    Using IPV6

                                    +

                                    To use IPv6 inside scylla_server.yml, add the IPv6 addresses with their square brackets.

                                    +

                                    For example:

                                    +
                                    - targets:
                                    +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67b9]"
                                    +      - "[2600:1f18:26b1:3a00:fac8:118e:9199:67ba]"
                                    +  labels:
                                    +      cluster: cluster1
                                    +      dc: dc1
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    For IPv6 to work, both scylla Prometheus address and node_exporter’s –web.listen-address should be set to listen to an IPv6 address.

                                    +
                                    +

                                    For general node information (disk, network, etc.) Scylla Monitoring Stack uses the node_exporter agent that runs on the same machine as Scylla does. +By default, Prometheus will assume you have a node_exporter running on each machine. If this is not the case, for example if Scylla runs in a container and the node_exporter runs on the host, you can override the node_exporter +targets configuration file by creating an additional file and passing it with the -n flag.

                                    +
                                    +

                                    Note

                                    +

                                    By default, there is no need to create node_exporter_server.yml. Prometheus will use the same targets it uses for +Scylla and will assume you have a node_exporter running on each Scylla server.

                                    +
                                    +

                                    If needed, you can set your own target file instead of the default prometheus/scylla_servers.yml, using the -s for Scylla target files.

                                    +

                                    For example:

                                    +
                                    ./start-all.sh -s my_scylla_server.yml -d prometheus_data
                                    +
                                    +
                                    +

                                    Mark the different Data Centers with Labels.

                                    +

                                    As can be seen in the examples, each target has its own set of labels to mark the cluster name and the data center (dc). +You can add multiple targets in the same file for multiple clusters or multiple data centers.

                                    +

                                    You can use the genconfig.py script to generate the server file. For example:

                                    +
                                    ./genconfig.py -d myconf -dc dc1:192.168.0.1,192.168.0.2 -dc dc2:192.168.0.3,192.168.0.4
                                    +
                                    +
                                    +

                                    This will generate a server file for four servers in two datacenters server 192.168.0.1 and 192.168.0.2 in dc1 and 192.168.0.3 and 192.168.0.4 in dc2.

                                    +

                                    OR

                                    +

                                    The genconfig.py script can also use nodetool status to generate the server file using the -NS flag.

                                    +
                                    nodetool status | ./genconfig.py -NS
                                    +
                                    +
                                    +

                                    2. Connect to Scylla Manager by creating prometheus/scylla_manager_servers.yml +If you are using Scylla Manager, you should set its IP and port in this file.

                                    +

                                    You must add a scylla_manager_servers.yml file even if you are not using the manager. +You can look at: prometheus/scylla_manager_servers.example.yml for an example.

                                    +

                                    For example if Scylla Manager host IP is 172.17.0.7 prometheus/scylla_manager_servers.yml would look like:

                                    +
                                    # List Scylla Manager end points
                                    +
                                    +- targets:
                                    +  - 172.17.0.7:5090
                                    +
                                    +
                                    +

                                    Note that you do not need to add labels to the Scylla Manager targets.

                                    +
                                    +
                                    +

                                    Configure Scylla nodes using Scylla-Manager Consul API

                                    +

                                    Scylla Manager 2.0 has a Consul like API.

                                    +

                                    When using the manager as the configuration source, there is no need to set any of the files. +Instead you should set the scylla-manager IP from the command line using the -L flag.

                                    +

                                    For example:

                                    +
                                    ./start-all.sh -L 10.10.0.1
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    If you are running Scylla-Manager on the same host as Scylla-Monitoring you should use -l flag so that the localhost address +will be available from within the container.

                                    +
                                    +
                                    +
                                    +

                                    Connecting Scylla-Monitoring to ScyllaDB

                                    +

                                    Scylla-Monitoring version 3.5 and higher can read tables from a ScyllaDB node using CQL. If your ScyllaDB cluster is user/password protected (See Scylla Authorization) you should assign a user and password for the Scylla-Grafana connection.

                                    +

                                    You can limit the user to read only, currently it only read table from the system keyspace.

                                    +

                                    You can set a user and password from a file or environment variables.

                                    +

                                    If the environment variables SCYLLA_USER and SCYLLA_PSSWD are set, they will be used.

                                    +

                                    To set the user and password from a file, edit grafana/datasource.scylla.yml. Uncomment the secureJsonData part and set the user and password.

                                    +
                                    +

                                    Note

                                    +

                                    It is best to use a dedicated user and password with limited privileges.

                                    +
                                    +
                                    +
                                    +

                                    Use an external directory for the Prometheus data directory

                                    +

                                    The -d flag, places the Prometheus data directory outside of its container and by doing that makes it persistent.

                                    +
                                    +

                                    Note

                                    +

                                    Specifying an external directory is important for systems in production. Without it, +every restart of the monitoring stack will result in metrics lost.

                                    +
                                    +

                                    If the directory provided does not exist, the start-all.sh script will create it. Note that you should avoid running docker as root, the start-all.sh script +will use the user permissions that runs it. This is important if you want to place the prometheus directory not under the user path but somewhere else, for example /prometheus-data.

                                    +

                                    In that case, you need to create the directory before calling start-all.sh and make sure it has the right permissions for the user running the command.

                                    +
                                    +
                                    +

                                    Add Additional Prometheus Targets

                                    +

                                    There are situations where you would like to monitor additional targets using the Prometheus server of the monitoring stack. +For example, an agent that runs on a firewall server. +The Prometheus server reads its targets from a file, this file is generated from a template when calling start-all.sh. +To add your targets you would need to edit the template file before calling start-all.sh.

                                    +

                                    The template file is either prometheus/prometheus.yml.template if Prometheus reads the Scylla target from file, or prometheus/prometheus.consul.yml.template +if Prometheus gets Scylla targets from the manager Consul API.

                                    +

                                    You can add a target at the end of the file, for example, the following example would read from a server with IP address 17.0.0.1 with a Prometheus port of 7000.

                                    +
                                    - job_name: 'myservice'
                                    +  # Override the global default and scrape targets from this job every 5 seconds.
                                    +  scrape_interval: 5s
                                    +  static_configs:
                                    +    - targets:
                                    +      - 17.0.0.1:7000
                                    +
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Start and Stop Scylla Monitoring Stack

                                    +
                                    +

                                    Start

                                    +
                                    ./start-all.sh -d prometheus_data
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Stop

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Start a Specific Scylla Monitoring Stack Version

                                    +

                                    By default, start-all.sh will start with dashboards for the latest Scylla Open source version and the latest Scylla Manager version.

                                    +

                                    You can specify specific scylla version with the -v flag and Scylla Manager version with -M flag.

                                    +

                                    Multiple versions are supported. For example:

                                    +
                                    ./start-all.sh -v 2020.1,2019.1 -M 2.1 -d prometheus-data
                                    +
                                    +
                                    +

                                    will load the dashboards for Scylla Enterprise versions 2020.1 and 2019.1 and the dashboard for Scylla Manager 2.1

                                    +
                                    +
                                    +

                                    Accessing the localhost

                                    +

                                    The Prometheus server runs inside a Docker container if it needs to reach a target on the local- host: either Scylla or Scylla-Manager, it needs to use the host network and not the Docker network. +To do that run ./start-all.sh with the -l flag. For example:

                                    +
                                    ./start-all.sh -l -d prometheus-data
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Configure rsyslog on each Scylla node

                                    +

                                    generates metrics and alerts from logs. To get full functionality, you should use rsyslog. Scylla Monitoring Stack will act as an additional rsyslog server. +Scylla Monitoring Stack collects Scylla logs using Loki and generates metrics and alerts based on these logs. +To use this feature, you need to direct logs from each Scylla node to Loki. +The recommended method to do this is by using rsyslog, where Scylla Monitoring Stack (Loki) acts as an additional rsyslog server. +.. note:: Scylla can send logs to more than one log collection service.

                                    +

                                    Prerequisite, make sure rsyslog is installed and running. If rsyslog is not installed, follow the installation instruction.

                                    +

                                    Add scylla’s rsyslog configuration file. Add the file: /etc/rsyslog.d/scylla.conf.

                                    +

                                    If Scylla Monitoring Stack IP is 10.0.0.1, the file should look like

                                    +
                                    if $programname ==  'scylla' then @@10.0.0.1:1514;RSYSLOG_SyslogProtocol23Format
                                    +
                                    +
                                    +

                                    Restart rsyslog for the configuration to take effect.

                                    +
                                    systemctl restart rsyslog
                                    +
                                    +
                                    +
                                    +
                                    +
                                    +

                                    View Grafana Dashboards

                                    +

                                    Point your browser to your-server-ip:3000 +By default, Grafana authentication is disabled. To enable it and set a password for user admin use the -a option.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/install/monitoring_stack.html b/stable/install/monitoring_stack.html new file mode 100644 index 000000000..eab0c95d6 --- /dev/null +++ b/stable/install/monitoring_stack.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/install/start-all.html b/stable/install/start-all.html new file mode 100644 index 000000000..936a9ee67 --- /dev/null +++ b/stable/install/start-all.html @@ -0,0 +1,745 @@ + + + + + + + + + + + + + The start-all.sh Command | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    The start-all.sh Command

                                    +

                                    Scylla Monitoring Stack is container-based. The simplest way to configure and start the monitoring is with the start-all.sh command.

                                    +

                                    The start-all.sh script is a small utility that sets the dashboards and starts the containers with the appropriate configuration.

                                    +
                                    +

                                    General Options

                                    +

                                    -h Help, Print the help, and exit.

                                    +

                                    –version print the current Scylla-Monitoring stack version, and exit.

                                    +

                                    -l local. Use the host network. This is important when one of the containers needs access to an application that runs on the host. +For example, when Scylla Manager runs on the localhost next to the monitoring. +Because the monitoring applications run inside containers by default, their local IP address (127.0.0.1) is the container’s local IP address. +You cannot use port mapping when using the -l flag

                                    +

                                    -A bind-to-ip-address Bind the listening-address to an explicit IP address.

                                    +

                                    -D encapsulate docker param Allows passing additional parameters to all the docker containers. For example, to start the monitoring containers with a specific network driver use -D “–net=network_name”.

                                    +

                                    –auto-restart When set, Docker will automatically restart all the services inside the containers in case of a failure.

                                    +

                                    –compose This is an experimental option. When set, it initiates a two-stage process. Firstly, a docker-compose.yml file is created along with an .env file. Following this, the script executes docker-compose up. Please note that having docker-compose is a prerequisite.

                                    +
                                    + + +
                                    +

                                    Alert Manager

                                    +

                                    The Alertmanager handles the alerts and takes the following parameters:

                                    +

                                    -m alertmanager-port Override the default Alertmanager port, this is done using port mapping, note that port mapping does not work when using the host network.

                                    +

                                    -r alert-manager-config By default, the Alertmanager takes its configuration from rule_config.yml in the prometheus directory. The -r flag overrides it to another file.prometheus

                                    +

                                    -C alertmanager-commands Allows adding an arbitrary command line to the alertmanager container starting command.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/install/start_all.html b/stable/install/start_all.html new file mode 100644 index 000000000..f4d817f91 --- /dev/null +++ b/stable/install/start_all.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/install/thanos.html b/stable/install/thanos.html new file mode 100644 index 000000000..30f68a97b --- /dev/null +++ b/stable/install/thanos.html @@ -0,0 +1,744 @@ + + + + + + + + + + + + + Using Thanos as Data Source With Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Using Thanos as Data Source With Scylla Monitoring Stack

                                    +

                                    Scylla-Monitoring uses Prometheus for metrics collection, which works out-of-the-box, but Prometheus does have limitations. +Thanos  is an opensource solution which when used on top of Prometheus, provides additional functionalities such as:

                                    +
                                      +
                                    • High-availability.

                                    • +
                                    • Horizontal scaling.

                                    • +
                                    • Backup.

                                    • +
                                    +

                                    The benefit is that with Thanos’ flexible design you can use some or all of these features depending on your requirements.

                                    +

                                    The rest of this document describes how to place Thanos in front of a multiple Prometheus servers and act as a Grafana datasource instead of Prometheus.

                                    +
                                    +

                                    Using Thanos As a Prometheus Aggregator

                                    +

                                    There are a few reasons why you would need multiple Prometheus servers: if the total number of your time series reaches millions you can reach the limit of a single Prometheus server capacity. +Sometimes it is also useful to limit the traffic between data centers, so you can have a Prometheus server per DC.

                                    +
                                    +

                                    Prometheus Configuration

                                    +

                                    We will assume you have two Prometheus servers running.

                                    +
                                      +
                                    1. If you are running Prometheus using a container, you should use an external data directory, make sure it is reachable by other containers.

                                    2. +
                                    3. You will need to add the –web.enable-lifecycle flag to your Prometheus command-line option.

                                    4. +
                                    +
                                    +
                                    +

                                    Thanos sidecar

                                    +

                                    The Thanos sidecar is an agent that read from a local Prometheus. Thanos uses a single docker container for different uses, the container would act +differently based on the command line it gets. +You will need a sidecar for each of your Prometheus servers. +A docker command looks like:

                                    +
                                    docker run -d \
                                    + -v /path/to/prom/dir:/data/prom:z \
                                    + -i --name sidecar thanosio/thanos \
                                    + sidecar \
                                    + --grpc-address=0.0.0.0:10911 \
                                    + --grpc-grace-period=1s \
                                    + --http-address=0.0.0.0:10912 \
                                    + --http-grace-period=1s \
                                    + --prometheus.url=http://prometheus-ip:9090 \
                                    + --tsdb.path=/data/prom \
                                    + -p 10912:10912 \
                                    + -p 10911:10911
                                    +
                                    +
                                    +

                                    After you run the sidecar you should be able to reach it from your browser at: http://{ip}:10912

                                    +
                                    +
                                    +

                                    Thanos query

                                    +

                                    Thanos query is the aggregator, it expose a Prometheus like API and read from multiple thanos stores (in this case the Thanos stores are the sidecars). +You run Thanos query together with Scylla . Assuming that you have two sidecars running on IP addresses: ip1 and ip2, +Start the container by running:

                                    +
                                    docker run -d \
                                    + --name thanos -- thanosio/thanos \
                                    +   query \
                                    +   --debug.name=query0 \
                                    +   --log.level=debug \
                                    +   --grpc-address=0.0.0.0:10903 \
                                    +   --grpc-grace-period=1s \
                                    +   --http-address=0.0.0.0:10904 \
                                    +   --http-grace-period=1s \
                                    +   --query.replica-label=prometheus \
                                    +   --store={ip1}:10911 --store={ip2}:10911
                                    +
                                    +
                                    +

                                    After you run Thanos query, you can connect to its HTTP server, in the above example at http://{ip}:10903

                                    +
                                    +
                                    +

                                    Update Scylla Data source

                                    +

                                    The last step is to update the Grafana data source to read from the local Thanos instead of from Prometheus. Edit grafana/datasource.yml +and replace DB_ADDRESS with {ip}:10903 (The IP address could be of the container as long as it is reachable).

                                    +

                                    The file you edit is a template file that replaces the file Grafana uses, next time you start.

                                    +

                                    Restart the Scylla Monitoring Stack it should now use Thanos.

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/intro.html b/stable/intro.html new file mode 100644 index 000000000..7afdcda30 --- /dev/null +++ b/stable/intro.html @@ -0,0 +1,693 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    ScyllaDB Monitoring Stack

                                    +

                                    ScyllaDB Monitoring Stack is a full stack for ScyllaDB monitoring and alerting. The stack contains open source tools including Prometheus and Grafana, as well as custom ScyllaDB dashboards and tooling.

                                    +_images/monitor.png +

                                    The ScyllaDB Monitoring Stack consists of multiple components, wrapped in Docker containers:

                                    +
                                      +
                                    • prometheus - Collects and stores metrics

                                    • +
                                    • grafan-loki - Parses logs and generates metrics and alerts

                                    • +
                                    • alertmanager - Handles alerts

                                    • +
                                    • grafana - Dashboards server

                                    • +
                                    +

                                    A few optional components are used for additional services

                                    +
                                      +
                                    • grafana-image-renderer - Allows you to download a dashboard as an image.

                                    • +
                                    • Thanos sidecar - Allows a centralized Thanos server to read from the local Prometheus server.

                                    • +
                                    +
                                    +

                                    High Level Architecture

                                    +_images/monitoring_stack1.png +

                                    We use Prometheus for metrics collection and storage, and to generate alerts. Prometheus collects Scylla’s metrics from ScyllaDB and the +host metrics from the node_exporter agent that runs on the ScyllaDB server.

                                    +

                                    We use Loki for metrics and alerts generation based on logs, Loki gets the logs from rsyslog agents that run on each of the DB servers.

                                    +

                                    The alertmanager, receives alerts from Prometheus and Loki and distributes them to other systems like email and slack.

                                    +

                                    We use Grafana to display the dashboards. Grafana gets its data from Prometheus, the alertmanager and directly from ScyllaDB using CQL.

                                    +

                                    Choose a topic to get started:

                                    + +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/objects.inv b/stable/objects.inv new file mode 100644 index 000000000..7f8272894 Binary files /dev/null and b/stable/objects.inv differ diff --git a/stable/procedures/alerts/alerting.html b/stable/procedures/alerts/alerting.html new file mode 100644 index 000000000..74ba8ba19 --- /dev/null +++ b/stable/procedures/alerts/alerting.html @@ -0,0 +1,762 @@ + + + + + + + + + + + + + Alerting | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Alerting

                                    +

                                    Alerts are a Prometheus enhancement to notify that something is wrong in the system.

                                    +

                                    You can read more about Prometheus alerting here

                                    +

                                    By default, alerts are shown in the overview dashboard, but you can also configure the alerts to be sent to +other external systems like email or slack.

                                    +

                                    In general, alerts are generated by Prometheus when a specific condition is met within a certain period of time, +they are then sent to the Alertmanager, that can send them to external systems.

                                    +

                                    The Alertmanager also acts as a data source for Grafana so the active alerts are shown in the dashboard.

                                    +../../_images/monitoring_stack.png +
                                    +

                                    Prometheus Alerts

                                    +

                                    The Prometheus alerts are defined in files placed under prometheus/prom_rules/. Prometheus will load any file that ends with yml or yaml.

                                    +

                                    Each Prometheus alert consists of:

                                    +
                                      +
                                    • Name

                                    • +
                                    • What happened

                                    • +
                                    • For how long

                                    • +
                                    • What to report

                                    • +
                                    +

                                    For example, let us look at the InstanceDown alert that comes by default as part of Scylla-Monitoring.

                                    +
                                    - alert: InstanceDown
                                    +  expr: up == 0
                                    +  for: 60s
                                    +  labels:
                                    +    severity: "error"
                                    +  annotations:
                                    +    description: '{{ $labels.instance }} has been down for more than 30 seconds.'
                                    +    summary: Instance {{ $labels.instance }} down
                                    +
                                    +
                                    +

                                    The expr is a legal Prometheus expression, in this case, the up metric is equal to 0.

                                    +

                                    The for set the minimal duration before the alert will be active. Prior to that, the alert will be in pending-mode and will not be sent.

                                    +

                                    The labels part holds additional labels that will be added to the alert, in the example, the severity label will be set to error.

                                    +

                                    annotations are special labels that add a description to the alert and can be used in emails and notification when the alert is forward to external systems.

                                    +
                                    +

                                    Alerts severity

                                    +

                                    Prometheus uses the following severities from low to high: info, warn, error, critical.

                                    +

                                    The Alertmanager inhibition rule (see the Alertmanager section) makes +sure that an alert with higher priority will mute the lower priority rule. For example, out-of-disk space alerts have different thresholds, +this way when the error alert for disk-full is firing, it silences the warn alert.

                                    +

                                    When adding your own alerts, you can use the severities to signal the action’s importance, for example critical would be a pager-duty, while an error will be an email.

                                    +
                                    +
                                    +

                                    Adding Alerts

                                    +

                                    Add your own alerts in a separate file with a yml or yaml extension. Making it easier during upgrade.

                                    +
                                    +
                                    +

                                    Modifying Alerts

                                    +

                                    It is a common practice to update the alerts that comes with the monitoring stack. Verify that the existing alerts suitable to your needs. +When modifying an alert, remember that it will be overridden on you next upgrade.

                                    +
                                    +
                                    +
                                    +

                                    Alertmanager

                                    +

                                    The Alertmanager gets the alerts from the Prometheus server responsible for duplicating, grouping and routing.

                                    +

                                    The Alertmanager configuration is found in rule_config.yml file that is located in the prometheus directory. +The configuration consists of three parts:

                                    +
                                      +
                                    • Routes: Represent a routing tree, the most specific rule, wins

                                    • +
                                    • Inhibition: Mute an alert, based on another alert

                                    • +
                                    • Receiver: Send a notification via email, sluck, etc’

                                    • +
                                    +

                                    Check the Alertmanager documentation for details on how to specify a specific receiver.

                                    +

                                    In the default configuration, the Grafana server will use the Alertmanager as a data source for the alert table found in the overview dashboard.

                                    +
                                    +
                                    +

                                    Tips When Adding an Alert

                                    +

                                    It’s worse having an alert that does not work, than not having an alert at all

                                    +

                                    There are multiple ways you can use to make sure your alert is set correctly:

                                    +
                                      +
                                    • Start with making sure that the full path (alert to mail or dashboard) is working a simple way is by negating the logic.

                                    • +
                                    • Force the alert to be active by reducing the limits or the duration.

                                    • +
                                    • When possible simulate the actual scenario and see that the alert works as expected.

                                    • +
                                    +

                                    For example, low available disk space.

                                    +

                                    Assume that you want an alert when you have lower than 10% disk space. +You can start by setting the alert that is fired when you have more than 10% disk space. +That would show that the alert is active and is propagated to the dashboard and to any external system you are using. +You can then set the alert rule to a value similar to the current situation.

                                    +

                                    Now you are sure that when setting the expression to alert when the free space below 10% the alert would work, but if possible, +simulate that situation, in this case by creating some big files.

                                    +

                                    Starting with a simple working expression helps you bisect problems.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/procedures/alerts/index.html b/stable/procedures/alerts/index.html new file mode 100644 index 000000000..f03e08c52 --- /dev/null +++ b/stable/procedures/alerts/index.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Alert Manager | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Alert Manager

                                    +
                                    +
                                    +

                                    Alerts are a Prometheus enhancement used to notify you that something is wrong in your system. +Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/procedures/datadog/index.html b/stable/procedures/datadog/index.html new file mode 100644 index 000000000..12b57cdcf --- /dev/null +++ b/stable/procedures/datadog/index.html @@ -0,0 +1,737 @@ + + + + + + + + + + + + + Scylla Monitoring Datadog Integration | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Datadog Integration

                                    +

                                    The safest way to use Datadog with Scylla is to load the metrics, using a Datadog Agent, from a Prometheus server and not directly from Scylla nodes. +The integration consists of:

                                    +
                                      +
                                    1. Installing and configuring the Datadog Agent.

                                    2. +
                                    3. Add Datadog recording rules.

                                    4. +
                                    5. Loading Scylla dashboard to Datadog.

                                    6. +
                                    7. Optionally load Monitor (Alerts).

                                    8. +
                                    +
                                    +

                                    Note

                                    +

                                    Scylla Cloud users, use and update the proper configuration file.

                                    +
                                    +
                                    +

                                    Install And configure the Datadog Agent

                                    +

                                    Start by following Installation guide. The datadog agent should run on a machine that can reach the Prometheus server.

                                    +

                                    Once the Datadog agent is working, download the configuration file and place it under /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                    +
                                    +

                                    Scylla Cloud Users

                                    +

                                    Scylla Cloud users, download the configuration file conf.yaml move it to: /etc/datadog-agent/conf.d/prometheus.d/conf.yaml

                                    +

                                    Edit the file. You must replace the cluster id (CLUSTER_ID) and the token (TOKEN).

                                    +
                                    +
                                    +

                                    Other Scylla Users

                                    +

                                    Other Scylla users, download the configuration file conf.yaml and replace the ip address of the Prometheus server.

                                    +
                                    +
                                    +

                                    Post configuration

                                    +

                                    Restart the agent based on your installation. Scylla metrics should be visible in Datadog.

                                    +
                                    +

                                    Note

                                    +

                                    By default, Datadog will not scrap per-shard metrics. To enable per-shard metrics, edit the conf.yaml file and replace dd=~”1” with dd=~”1|2”

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Add datadog recording rules

                                    +

                                    Non Scylla Cloud users, download the rules configuration file datadog.rules.yml if you need per-shard metrics, download datadog.rules-with-shards.yml and place it under prometheus/prom_rules/. +Per-shards metrics adds load and cost to both the Prometheus server and Datadog agent and server, so only use it if needed.

                                    +

                                    Cloud users, skip this step, it’s been take care for by the cloud.

                                    +
                                    +
                                    +

                                    Upload the Dashboard

                                    +

                                    Download the dashboard file dashboard.json. +Create a new dashboard in Datadog and import the json file you downloaded.

                                    +
                                    +
                                    +

                                    Using the Dashboard

                                    +

                                    We created a Datadog dashboard that resembles the Grafana dashboards available to Scylla and Scylla-Cloud users.

                                    +../../_images/datadog.png +

                                    The dashboard contains some specific filtering and perspectives: +First, you can choose between shard, instance, dc, or cluster view. +This will aggregate the metrics in the graphs accordingly. +Second, you can filter to see specific shards, nodes, or DCs.

                                    +
                                    +

                                    Note

                                    +

                                    Pay attention that some of the combinations are conflicting. For example, you cannot filter by DC when looking at a cluster view. If no data displayed, remove the filters first.

                                    +
                                    +
                                    +
                                    +

                                    Adding Monitor

                                    +

                                    Alerts in Datadog called Monitor. Download the monitor file monitor.json. Go to the Monitor section in datadog and import the json.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/procedures/index.html b/stable/procedures/index.html new file mode 100644 index 000000000..a21298b98 --- /dev/null +++ b/stable/procedures/index.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + ScyllaDB Monitoring Stack Procedures | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    ScyllaDB Monitoring Stack Procedures

                                    +
                                    +
                                    +

                                    There are several reference guides available which give additional information. Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/procedures/updating-dashboard.html b/stable/procedures/updating-dashboard.html new file mode 100644 index 000000000..1d252b8e4 --- /dev/null +++ b/stable/procedures/updating-dashboard.html @@ -0,0 +1,949 @@ + + + + + + + + + + + + + Adding and Modifying Dashboards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Adding and Modifying Dashboards

                                    +

                                    This document explains how to update or create Grafana dashboards for the Scylla Monitoring Stack.

                                    +

                                    It covers dashboard templates and how to modify them.

                                    + +
                                    +

                                    General Limitations

                                    +

                                    Scylla Monitoring Stack uses Grafana for its dashboards. +The dashboards are provisioned from files and are stored in the Grafana internal storage. +There are two potential consistency issues, covered below.

                                    +
                                    +

                                    Consistency Between Restarts

                                    +

                                    By default, the Grafana internal storage is within the container. That means that whenever you restart the Scylla Monitoring Stack (explicitly when restarting Grafana) any local changes will not be persisted. +If you are making changes and saving changes from the GUI make sure to configure an external directory for Grafana.

                                    +
                                    +
                                    +

                                    Consistency Between Upgrades

                                    +

                                    As mentioned earlier, the dashboards are provisioned from files, this means that when the files are changed, any changes stored locally will be overridden. For this reason, do not make permanent changes to a dashboard, or your changes eventually will be lost.

                                    +
                                    +

                                    Note

                                    +

                                     You can save a dashboard change you made from the GUI, but it can be overridden. This should be avoided.

                                    +
                                    +

                                    At large, we suggest maintaining your dashboards as files, as Scylla Monitoring does.

                                    +
                                    +
                                    +
                                    +

                                    Using Templated Dashboards

                                    +

                                    Scylla Monitoring uses dashboard templates as we found the Grafana dashboards in JSON format to be too verbose to be maintainable.

                                    +

                                    Each element in the dashboard file (Each JSON object) contains all of its attributes and values.

                                    +

                                    For example a typical graph panel would look like this:

                                    +
                                    {
                                    +    "aliasColors": {},
                                    +    "bars": false,
                                    +    "datasource": "prometheus",
                                    +    "editable": true,
                                    +    "error": false,
                                    +    "fill": 0,
                                    +    "grid": {
                                    +        "threshold1": null,
                                    +        "threshold1Color": "rgba(216, 200, 27, 0.27)",
                                    +        "threshold2": null,
                                    +        "threshold2Color": "rgba(234, 112, 112, 0.22)"
                                    +    },
                                    +    "gridPos": {
                                    +        "h": 6,
                                    +        "w": 10,
                                    +        "x": 0,
                                    +        "y": 4
                                    +    },
                                    +    "id": 2,
                                    +    "isNew": true,
                                    +    "legend": {
                                    +        "avg": false,
                                    +        "current": false,
                                    +        "max": false,
                                    +        "min": false,
                                    +        "show": false,
                                    +        "total": false,
                                    +        "values": false
                                    +    },
                                    +    "lines": true,
                                    +    "linewidth": 2,
                                    +    "links": [],
                                    +    "nullPointMode": "connected",
                                    +    "percentage": false,
                                    +    "pointradius": 5,
                                    +    "points": false,
                                    +    "renderer": "flot",
                                    +    "seriesOverrides": [
                                    +        {}
                                    +    ],
                                    +    "span": 5,
                                    +    "stack": false,
                                    +    "steppedLine": false,
                                    +    "targets": [
                                    +        {
                                    +            "expr": "sum(node_filesystem_avail) by (instance)",
                                    +            "intervalFactor": 1,
                                    +            "legendFormat": "",
                                    +            "refId": "A",
                                    +            "step": 1
                                    +        }
                                    +    ],
                                    +    "timeFrom": null,
                                    +    "timeShift": null,
                                    +    "title": "Available Disk Size",
                                    +    "tooltip": {
                                    +        "msResolution": false,
                                    +        "shared": true,
                                    +        "sort": 0,
                                    +        "value_type": "cumulative"
                                    +    },
                                    +    "transparent": false,
                                    +    "type": "graph",
                                    +    "xaxis": {
                                    +        "show": true
                                    +    },
                                    +    "yaxes": [
                                    +        {
                                    +            "format": "percent",
                                    +            "logBase": 1,
                                    +            "max": 101,
                                    +            "min": 0,
                                    +            "show": true
                                    +        },
                                    +        {
                                    +            "format": "short",
                                    +            "logBase": 1,
                                    +            "max": null,
                                    +            "min": null,
                                    +            "show": true
                                    +        }
                                    +    ]
                                    +}
                                    +
                                    +
                                    +

                                    As you can imagine, most panels would have similar values.

                                    +

                                    To reduce the redundancy of the Grafana JSON format, we added dashboard templates.

                                    +
                                    +

                                    The Template Class System

                                    +

                                    The Scylla Monitoring Stack dashboard templates use a class attribute that can be added to any JSON object in a template file. +The different classes are defined in a file.

                                    +

                                    The class system resembles CSS classes. It is hierarchical, so a class type definition can have a class attribute and +it would inherit that class attributes, the inherited class can add or override inherited attributes.

                                    +

                                    In the template file, you can also add or override attributes.

                                    +

                                    The Scylla Monitor generation script, uses the types.json file and a template file and creates a dashboard.

                                    +

                                    When generating dashboards, each class will be replaced by its definition.

                                    +

                                    For example, a row in the type.json is defined as:

                                    +
                                    {
                                    + "base_row": {
                                    +     "collapse": false,
                                    +     "editable": true
                                    + },
                                    + "row": {
                                    +     "class": "base_row",
                                    +     "height": "250px"
                                    + }
                                    + }
                                    +
                                    +
                                    +

                                    Will be used like in a template:

                                    +
                                    {
                                    +     "class": "row",
                                    +     "height": "150px",
                                    +     "panels": [
                                    +     ]
                                    +}
                                    +
                                    +
                                    +

                                    And the output will be:

                                    +
                                    {
                                    +     "class": "row",
                                    +     "collapse": false,
                                    +     "editable": true,
                                    +     "height": "150px",
                                    +     "panels": [
                                    +
                                    +     ]
                                    +}
                                    +
                                    +
                                    +

                                    We can see that the template added the panels attribute and that it overrides the height attribute.

                                    +
                                    +
                                    +

                                    Panel Example

                                    +

                                    Consider the following example that defines a row inside a dashboard with a graph +panel for the available disk size.

                                    +
                                    {
                                    +     "class": "row",
                                    +     "panels": [
                                    +         {
                                    +             "class": "bytes_panel",
                                    +             "span": 3,
                                    +             "targets": [
                                    +                 {
                                    +                     "expr": "sum(node_filesystem_avail) by (instance)",
                                    +                     "intervalFactor": 1,
                                    +                     "legendFormat": "",
                                    +                     "metric": "",
                                    +                     "refId": "A",
                                    +                     "step": 1
                                    +                 }
                                    +             ],
                                    +             "title": "Available Disk Size"
                                    +         }
                                    +     ]
                                    +}
                                    +
                                    +
                                    +

                                    In the example, the bytes_panel class generates a graph with bytes as units (that would mean that your +Y axis units would adjust themselves to make the graph readable (i.e. GB, MB, bytes, etc’).

                                    +

                                    You can also see that the span attribute is overridden to set the panel size.

                                    +

                                    To get a grasp of the difference, take a look at the Grafana panel example and see how it looks originally.

                                    +
                                    +
                                    +

                                    Grafana Formats and Layouts

                                    +

                                    The Grafana layout used to be based on rows, where each row contained multiple panels. +Each row would have a total of 12 panels and if the total span of the panels was larger than 12, it would +break them into multiple lines. This is no longer the case.

                                    +

                                    Starting from Grafana version 5.0 and later, rows were no longer supported, they were replaced with a layout that uses +absolute positions (i.e. X,Y, height, width).

                                    +

                                    The server should be backward compatible, but we’ve found it had issues with parsing it correctly. +More so, absolute positions are impossible to get right when done by hand.

                                    +

                                    To overcome these issues, the dashboard generation script will generate the dashboards in the Grafana version 5.0 format. +In the transition, rows will be replaced with a calculated absolute position.

                                    +

                                    The panel’s height will be taken from their row. The span attribute is still supported as is row height.

                                    +

                                    You can use the gridPos attribute which is a Grafana 5.0 format, but unlike Grafana, you can use partial attributes.

                                    +

                                    gridPos has the following attributes:

                                    +
                                    {
                                    +   "x": 0,
                                    +   "y": 0,
                                    +   "w": 24,
                                    +   "h": 4
                                    + }
                                    +
                                    +
                                    +

                                    When using Scylla’s template you don’t need to supply all of the attributes, so for example to specify that a row is 2 units high you can use:

                                    +
                                    {
                                    +   "gridPos": {
                                    +      "h": 2
                                    +    }
                                    +}
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Generating the dashboards from templates (generate-dashboards.sh)

                                    +
                                    +

                                    Prerequisite

                                    +

                                    Python 2.7

                                    +

                                    make_dashboards.py is a utility that generates dashboards from templates or helps you update the templates when working in reverse mode (the -r flag).

                                    +

                                    Use the -h flag to get help information.

                                    +

                                    You can use the make_dashboards.py to generate a single dashboard, but it’s usually easier to use the +generate-dashboards.sh wrapper.

                                    +

                                    When you’re done changing an existing dashboard template, run the generate-dashboards.sh with the current version, +to replace your existing dashboards.

                                    +

                                    For example, if you are changing a dashboard in Scylla Enterprise version 2020.1 run:

                                    +

                                    .\generate-dashboards.sh -v 2020.1

                                    +
                                    +

                                    Note

                                    +

                                    generate-dashboards.sh will update the dashboards in place, there is no need for a restart for the changes to take effect, just refresh the dashboard.

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validation

                                    +

                                    After making changes to a template, run the generate_generate-dashboards.sh and make sure that it ran without any errors.

                                    +

                                    Refresh your browser for changes to take effect. +Make sure that your panels contain data, if not, maybe there is something wrong with your expr attribute.

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/procedures/updating_dashboard.html b/stable/procedures/updating_dashboard.html new file mode 100644 index 000000000..9f5ed39d1 --- /dev/null +++ b/stable/procedures/updating_dashboard.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/reference/index.html b/stable/reference/index.html new file mode 100644 index 000000000..0db6d7c8e --- /dev/null +++ b/stable/reference/index.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Reference Guide | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Reference Guide

                                    +
                                    +
                                    +

                                    There are several reference guides available which give additional information. Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/reference/matrix.html b/stable/reference/matrix.html new file mode 100644 index 000000000..4113e938f --- /dev/null +++ b/stable/reference/matrix.html @@ -0,0 +1,845 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Support Matrix | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Support Matrix

                                    +

                                    The following table shows which version of Scylla Monitoring Stack supports dashboards for which versions of Scylla and Scylla Manager.

                                    + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

                                    Scylla Monitoring Stack Version

                                    Scylla Open Source Version

                                    Scylla Enterprise Version

                                    Node_exporter[1] Version

                                    Scylla Manager Version

                                    4.6

                                    5.2, 5.4

                                    2021.1, 2022.1, 2022.2, 2023.1, 2024.1

                                    1.4.1

                                    3.0, 3.1, 3.2

                                    4.5

                                    5.0,5.1,5.2,5.4

                                    2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                    1.4.1

                                    3.0, 3.1, 3.2

                                    4.4.5

                                    5.0,5.1,5.2,5.4

                                    2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                    1.4.1

                                    3.0, 3.1, 3.2

                                    4.4

                                    5.0,5.1,5.2

                                    2020.1, 2021.1, 2022.1, 2022.2, 2023.1

                                    1.4.1

                                    3.0, 3.1

                                    4.3

                                    5.0,5.1,5.2

                                    2020.1, 2021.1, 2022.1, 2022.2

                                    1.4.1

                                    2.5, 2.6, 3.0

                                    4.2

                                    4.5,4.6,5.0,5.1

                                    2020.1, 2021.1, 2022.1, 2022.2

                                    1.4.1

                                    2.5, 2.6, 3.0

                                    4.1

                                    4.5,4.6,5.0,5.1

                                    2020.1, 2021.1, 2022.1, 2022.2

                                    0.17

                                    2.5, 2.6, 3.0

                                    4.0

                                    4.3, 4.4, 4.5, 4.6, 5.0

                                    2020.1, 2021.1, 2022.1

                                    0.17

                                    2.3, 2.4, 2.5, 2.6, 3.0

                                    3.11

                                    4.3, 4.4, 4.5, 4.6, 5.0

                                    2020.1, 2021.1, 2022.2

                                    0.17

                                    2.3, 2.4, 2.5, 2.6

                                    3.10

                                    4.3, 4.4, 4.5, 4.6

                                    2020.1, 2021.1

                                    0.17

                                    2.3, 2.4, 2.5, 2.6

                                    3.9

                                    4.3, 4.4, 4.5, 4.6

                                    2020.1, 2021.1

                                    0.17

                                    2.3, 2.4, 2.5

                                    3.8

                                    4.3, 4.4, 4.5

                                    2020.1, 2021.1

                                    0.17

                                    2.3, 2.4, 2.5

                                    3.7

                                    4.2, 4.3, 4.4

                                    2019.1, 2020.1, 2021.1

                                    0.17

                                    2.2, 2.3

                                    3.6.3

                                    4.2, 4.3, 4.4

                                    2019.1, 2020.1, 2021.1

                                    0.17

                                    2.2, 2.3, 2.1

                                    3.6

                                    4.1, 4.2, 4.3

                                    2019.1, 2020.1

                                    0.17

                                    2.1, 2.2, 2.3

                                    3.6.1

                                    4.1, 4.2, 4.3

                                    2019.1, 2020.1

                                    0.17

                                    2.1, 2.2

                                    3.6.1

                                    4.1, 4.2, 4.3, 4.4

                                    2019.1, 2020.1

                                    0.17

                                    2.1, 2.2

                                    3.5

                                    3.3, 4.0, 4.1, 4.2

                                    2019.1, 2020.1

                                    0.17

                                    2.0, 2.1, 2.2

                                    3.4.3

                                    3.3, 4.0, 4.1, 4.2

                                    2019.1, 2020.1

                                    0.17

                                    2.0, 2.1

                                    3.4

                                    3.3, 4.0, 4.1

                                    2018.1, 2019.1

                                    0.17

                                    2.0, 2.1

                                    3.3

                                    3.1, 3.2, 3.3, 4.0

                                    2018.1, 2019.1

                                    0.17

                                    1.4, 2.0, 2.1

                                    3.2

                                    3.1, 3.2, 3.3

                                    2018.1, 2019.1

                                    0.17

                                    1.4, 2.0

                                    3.1

                                    2.3, 3.0, 3.1, 3.2

                                    2018.1, 2019.1

                                    0.17

                                    1.3, 1.4, 2.0

                                    3.0

                                    2.3, 3.0, 3.1, 3.2

                                    2018.1, 2019.1

                                    0.17

                                    1.3, 1.4

                                    2.4

                                    2.3, 3.0, 3.1

                                    2018.1, 2019.1

                                    0.14, 0.17

                                    1.3, 1.4

                                    2.3

                                    2.3, 3.0

                                    2018.1, 2019.1

                                    0.14, 0.17

                                    1.3

                                    2.2

                                    2.3, 3.0

                                    2018.1, 2019.1

                                    0.14, 0.17

                                    1.3

                                    2.1

                                    2.3, 3.0

                                    2018.1

                                    0.14, 0.17

                                    1.3

                                    +

                                    [1] Node_exporter is a monitoring agent running on each Scylla node and reports OS metrics to Prometheus

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/reference/monitoring-apis.html b/stable/reference/monitoring-apis.html new file mode 100644 index 000000000..66b33af27 --- /dev/null +++ b/stable/reference/monitoring-apis.html @@ -0,0 +1,676 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Interfaces | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Interfaces

                                    +

                                    Scylla exposes two interfaces for online monitoring, as described below

                                    +
                                    +

                                    Prometheus API

                                    +

                                    By default, Scylla listens on port 9180 for Prometheus requests. To connect a Prometheus server to Scylla in your prometheus.yaml configuration file, add Scylla as a target with your-ip:9180

                                    +

                                    For more information on monitoring Scylla with Prometheus see Scylla Monitoring Stack.

                                    +

                                    You can change the Prometheus listening address and port in scylla.yaml file

                                    +
                                    # prometheus port
                                    +# By default, Scylla opens prometheus API port on port 9180
                                    +# setting the port to 0 will disable the prometheus API.
                                    +prometheus_port: 9180
                                    +#
                                    +# prometheus address
                                    +# By default, Scylla binds all interfaces to the prometheus API
                                    +# It is possible to restrict the listening address to a specific one
                                    +prometheus_address: 0.0.0.0
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/reference/monitoring_apis.html b/stable/reference/monitoring_apis.html new file mode 100644 index 000000000..801ff05b8 --- /dev/null +++ b/stable/reference/monitoring_apis.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/robots.txt b/stable/robots.txt new file mode 100644 index 000000000..06b2bc298 --- /dev/null +++ b/stable/robots.txt @@ -0,0 +1,3 @@ +User-agent: * + +Sitemap: https://docs.scylladb.com/sitemap.xml diff --git a/stable/search.html b/stable/search.html new file mode 100644 index 000000000..9b0118d11 --- /dev/null +++ b/stable/search.html @@ -0,0 +1,634 @@ + + + + + + + + + + + + + Search | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + + + +
                                    + + + + + +
                                    + + +
                                    + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/searchindex.js b/stable/searchindex.js new file mode 100644 index 000000000..7e55c64f8 --- /dev/null +++ b/stable/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["common/monitor-description", "index", "install/docker-compose", "install/index", "install/min-prod-hw", "install/monitor-without-docker", "install/monitoring-stack", "install/start-all", "install/thanos", "intro", "procedures/alerts/alerting", "procedures/alerts/index", "procedures/datadog/index", "procedures/index", "procedures/updating-dashboard", "reference/index", "reference/matrix", "reference/monitoring-apis", "troubleshooting/index", "troubleshooting/monitor-troubleshoot", "upgrade/index", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y", "use-monitoring/advisor/cqlAllowFiltering", "use-monitoring/advisor/cqlCLAll", "use-monitoring/advisor/cqlCLAny", "use-monitoring/advisor/cqlNoTokenAware", "use-monitoring/advisor/cqlNonPaged", "use-monitoring/advisor/cqlNonPrepared", "use-monitoring/advisor/heavyCompaction", "use-monitoring/advisor/index", "use-monitoring/advisor/nodeCLErrors", "use-monitoring/advisor/nodeIOErrors", "use-monitoring/advisor/nodeLocalErrors", "use-monitoring/advisor/nonBalancedcqlTraffic", "use-monitoring/advisor/preparedCacheEviction", "use-monitoring/advisor/systemOverload", "use-monitoring/cql-optimization", "use-monitoring/index"], "filenames": ["common/monitor-description.rst", "index.rst", "install/docker-compose.rst", "install/index.rst", "install/min-prod-hw.rst", "install/monitor-without-docker.rst", "install/monitoring-stack.rst", "install/start-all.rst", "install/thanos.rst", "intro.rst", "procedures/alerts/alerting.rst", "procedures/alerts/index.rst", "procedures/datadog/index.rst", "procedures/index.rst", "procedures/updating-dashboard.rst", "reference/index.rst", "reference/matrix.rst", "reference/monitoring-apis.rst", "troubleshooting/index.rst", "troubleshooting/monitor-troubleshoot.rst", "upgrade/index.rst", "upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.rst", "upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.rst", "upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.rst", "upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.rst", "use-monitoring/advisor/cqlAllowFiltering.rst", "use-monitoring/advisor/cqlCLAll.rst", "use-monitoring/advisor/cqlCLAny.rst", "use-monitoring/advisor/cqlNoTokenAware.rst", "use-monitoring/advisor/cqlNonPaged.rst", "use-monitoring/advisor/cqlNonPrepared.rst", "use-monitoring/advisor/heavyCompaction.rst", "use-monitoring/advisor/index.rst", "use-monitoring/advisor/nodeCLErrors.rst", "use-monitoring/advisor/nodeIOErrors.rst", "use-monitoring/advisor/nodeLocalErrors.rst", "use-monitoring/advisor/nonBalancedcqlTraffic.rst", "use-monitoring/advisor/preparedCacheEviction.rst", "use-monitoring/advisor/systemOverload.rst", "use-monitoring/cql-optimization.rst", "use-monitoring/index.rst"], "titles": ["<no title>", "ScyllaDB Monitoring Stack", "Using Docker Compose", "Download and Install Scylla Monitoring Stack", "Minimal Production System Recommendations", "Deploying Scylla Monitoring Stack Without Docker", "Install Scylla Monitoring Stack", "The start-all.sh Command", "Using Thanos as Data Source With Scylla Monitoring Stack", "ScyllaDB Monitoring Stack", "Alerting", "Scylla Monitoring Stack Alert Manager", "Scylla Monitoring Datadog Integration", "ScyllaDB Monitoring Stack Procedures", "Adding and Modifying Dashboards", "Scylla Monitoring Stack Reference Guide", "Scylla Monitoring Stack Support Matrix", "Scylla Monitoring Stack Interfaces", "Troubleshooting Guide for Scylla Monitoring Stack", "Troubleshoot Scylla Monitoring Stack", "Upgrade Scylla Monitoring Stack", "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y", "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y", "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y", "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b", "Some queries use ALLOW FILTERING", "Some queries use Consistency Level: ALL", "Some queries use Consistency Level: ANY", "Some queries are not token-aware", "Some SELECT queries are non-paged", "Some queries are non-prepared", "Compaction takes lots of memory and CPU", "Scylla Monitoring Stack Advisor", "Some operation failed due to unsatisfied consistency level", "I/O Errors can indicate a node with a faulty disk", "Some operations failed on the replica side", "CQL queries are not balanced among shards", "Prepared statements cache eviction", "System Overload", "The CQL Optimization", "Using Scylla Monitoring Stack"], "terms": {"4": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "6": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "branch": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "scylla": [0, 1, 2, 4, 7, 9, 10, 13, 14, 26, 27, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "monitor": [0, 2, 4, 7, 10, 14, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "stack": [0, 2, 4, 7, 10, 12, 14, 22, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41], "scylladb": [0, 2, 4, 5, 18, 19, 21, 22, 23, 24, 25, 30, 31, 33, 35, 37, 38, 41], "i": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16, 17, 19, 21, 23, 27, 28, 29, 30, 33, 34, 35, 37, 39, 40, 41], "full": [0, 1, 3, 6, 9, 10, 27], "alert": [0, 1, 3, 5, 6, 9, 12, 13], "The": [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 16, 19, 21, 23, 35, 37, 39], "contain": [0, 1, 2, 3, 5, 6, 7, 8, 9, 12, 14, 21, 30, 33, 39, 41], "open": [0, 1, 3, 5, 6, 9, 16, 17, 20, 25], "sourc": [0, 1, 3, 5, 6, 9, 10, 16, 20, 21, 39], "tool": [0, 1, 3, 9, 19, 41], "includ": [0, 1, 3, 5, 9], "prometheu": [0, 1, 3, 9, 11, 12, 14, 16, 19, 22, 23, 24, 25, 26, 41], "grafana": [0, 1, 3, 8, 9, 10, 12, 22, 24, 25, 26], "well": [0, 1, 3, 6, 9], "custom": [0, 1, 3, 9], "dashboard": [0, 1, 3, 4, 5, 7, 9, 10, 13, 16, 19, 22, 23, 24, 25, 26, 34, 41, 42], "consist": [1, 9, 10, 12, 21, 34], "three": [1, 6, 10, 25], "compon": [1, 5, 9], "wrap": [1, 9], "docker": [1, 3, 7, 8, 9, 19, 21, 25], "collect": [1, 5, 6, 7, 8, 9, 19, 23, 25, 35, 37], "store": [1, 5, 8, 9, 14, 22, 24, 25, 26, 28, 29, 39], "metric": [1, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16, 21, 22, 23, 24, 26, 41], "alertmanag": [1, 2, 7, 9, 22, 24, 25, 26], "handl": [1, 6, 7, 9], "server": [1, 2, 4, 5, 6, 7, 8, 9, 10, 12, 14, 17, 21, 27, 41], "choos": [1, 3, 9, 11, 12, 13, 15, 18, 19, 42], "topic": [1, 3, 9, 11, 13, 15, 18, 42], "get": [1, 6, 8, 9, 10, 14, 25, 28, 38, 39, 40, 41], "start": [1, 3, 5, 8, 9, 10, 12, 14, 21, 22, 23, 24, 26, 33], "user": [1, 2, 6, 7, 9, 27, 41], "guid": [1, 6, 9, 12, 13, 19, 20], "download": [1, 5, 6, 9, 12, 21, 22, 23, 24, 25, 26], "instal": [1, 2, 9, 19], "procedur": [1, 5, 6, 9, 19, 20], "troubleshoot": [1, 9], "refer": [1, 6, 9, 13], "upgrad": [1, 10, 13], "lesson": [1, 9, 28, 29, 30], "univers": [1, 9], "github": [1, 5, 6, 22, 24, 25, 26], "project": 1, "base": [2, 5, 6, 7, 8, 9, 10, 12, 14, 25, 27, 41], "you": [2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 30, 32, 33, 40, 41, 42], "can": [2, 5, 6, 7, 8, 10, 12, 14, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 30, 33, 34, 41, 42], "all": [2, 3, 5, 6, 8, 10, 14, 17, 19, 21, 23, 27, 31, 34, 41], "sh": [2, 3, 6, 19, 21, 22, 23, 24, 25, 26], "kill": [2, 6, 19, 21, 23], "script": [2, 3, 6, 7, 14, 23], "an": [2, 4, 5, 7, 8, 9, 14, 19, 21, 23, 25, 32, 34, 35, 37, 39, 41], "altern": [2, 6], "method": [2, 6], "It": [2, 5, 6, 7, 10, 14, 17, 21, 25], "requir": [2, 8, 28, 31, 35, 41], "more": [2, 4, 5, 6, 10, 14, 17, 19, 27, 30, 33, 35, 38, 41], "manual": [2, 19], "step": [2, 5, 8, 12, 14, 19, 21, 22, 23, 24, 25, 26], "onc": [2, 12, 21, 25, 32, 39, 41], "configur": [2, 7, 10, 14, 17, 19, 21, 33, 34], "simplifi": 2, "start_al": 2, "ar": [2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 26, 33, 34, 35, 36, 39, 40, 41, 42], "two": [2, 6, 7, 8, 14, 17, 21, 24, 25, 26, 39, 41], "wai": [2, 5, 7, 10, 12, 19, 25, 41], "launch": 2, "should": [2, 4, 5, 6, 8, 12, 14, 19, 21, 23, 24, 25, 26, 27, 28, 31, 32, 38, 41], "one": [2, 6, 7, 17, 19, 21, 22, 23, 24, 25, 26, 28, 30, 31, 33, 35, 41], "both": [2, 5, 6, 12, 19, 22, 24, 25, 26, 41], "In": [2, 6, 10, 14, 19, 21, 25, 33, 41], "particular": 2, "creat": [2, 5, 6, 7, 10, 12, 14, 19, 27, 39, 41], "updat": [2, 5, 10, 12, 14, 19, 21], "yml": [2, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 33, 41], "ignor": [2, 7], "when": [2, 4, 5, 6, 7, 8, 12, 14, 19, 21, 22, 24, 25, 26, 29, 33, 35, 40, 41], "make": [2, 5, 6, 7, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "sure": [2, 5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26, 41], "have": [2, 4, 5, 6, 7, 8, 10, 14, 19, 24, 25, 26], "among": [2, 34], "other": [2, 8, 9, 10], "ip": [2, 5, 6, 7, 8, 12, 17, 19, 21, 22, 24, 25, 26], "address": [2, 5, 6, 7, 8, 12, 17, 19, 21], "either": [2, 6], "locat": [2, 7, 10, 21, 23, 34], "scylla_serv": [2, 5, 6, 19, 21, 22, 23, 24, 25, 26, 41], "consul": [2, 7], "manag": [2, 5, 13, 16, 18, 26], "config": [2, 5, 7], "gener": [2, 5, 6, 9, 10, 41], "exampl": [2, 4, 5, 6, 7, 8, 10, 12, 19, 21, 22, 23, 24, 25, 26, 34, 35, 41], "For": [2, 4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 25, 34, 35, 38, 41], "product": [2, 7], "system": [2, 7, 9, 10, 11, 19, 22, 24, 25, 26, 28, 33, 34, 41], "advis": [2, 34, 41], "extern": [2, 5, 7, 8, 10, 14, 19, 22, 24, 25, 26, 41], "directori": [2, 5, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26], "databas": [2, 5, 7, 21, 30, 41], "accordingli": [2, 12], "see": [2, 4, 5, 6, 10, 12, 14, 17, 19, 21, 22, 23, 24, 25, 26, 33, 41], "below": [2, 5, 6, 10, 14, 17, 19], "read": [2, 5, 6, 8, 9, 10, 19, 21, 26, 27, 31, 33], "its": [2, 5, 6, 7, 8, 9, 14, 21], "from": [2, 5, 7, 8, 9, 10, 12, 21, 22, 23, 24, 25, 26, 27, 36, 41], "note": [2, 5, 6, 7, 19, 21, 22, 24, 25, 26], "latter": 2, "tell": 2, "where": [2, 5, 6, 14, 19, 21, 25, 41], "themselv": [2, 14], "which": [2, 8, 13, 14, 15, 16, 19, 33, 35, 37, 39, 41], "differ": [2, 5, 6, 7, 8, 10, 14, 21, 22, 23, 24, 25, 26, 32, 41], "run": [2, 3, 5, 6, 7, 8, 9, 12, 14, 16, 19, 21, 23, 33, 40], "follow": [2, 4, 5, 6, 7, 10, 12, 14, 16, 19, 21, 22, 24, 25, 26, 33, 41], "command": [2, 6, 8, 19, 21, 22, 24, 25, 26, 33], "datasourc": [2, 5, 6, 8, 14], "under": [2, 5, 6, 10, 12, 25], "yaml": [2, 5, 10, 12, 17], "To": [2, 4, 5, 6, 12, 14, 17, 21, 22, 23, 24, 25, 26], "sashboard": 2, "t": [2, 14, 25], "line": [2, 5, 6, 7, 8, 14, 21, 25, 33], "flag": [2, 6, 7, 8, 14, 19, 21, 22, 24, 25, 26], "v": [2, 6, 7, 8, 14, 19], "specifi": [2, 6, 7, 10, 14, 19, 21, 26, 33], "version": [2, 5, 7, 14, 16, 19], "enterpris": [2, 6, 14, 16], "2020": [2, 6, 14, 16], "1": [2, 5, 6, 7, 8, 12, 14, 16, 20, 22, 24, 25, 26], "thi": [2, 4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 22, 23, 24, 25, 26, 27, 28, 31, 33, 36, 40, 41], "your": [2, 5, 6, 7, 8, 10, 11, 12, 14, 17, 19, 21, 22, 24, 25, 26, 28, 29, 30, 41], "pass": [2, 6, 7, 21], "call": [2, 6, 7, 12], "servic": [2, 5, 6, 7, 9, 19], "container_nam": 2, "aalert": 2, "imag": [2, 9, 19], "prom": [2, 8, 19], "v0": [2, 5], "24": [2, 14, 25], "port": [2, 5, 6, 7, 17, 19, 21, 22, 24, 25], "9093": [2, 5], "volum": [2, 4, 5, 6, 22, 24, 25, 26], "rule_config": [2, 5, 7, 10], "etc": [2, 5, 6, 7, 10, 12, 14, 19, 25], "agraf": 2, "environ": [2, 6, 7], "gf_panels_disable_sanitize_html": 2, "true": [2, 5, 14, 23, 33], "gf_paths_provis": 2, "var": [2, 5], "lib": [2, 5], "gf_plugins_allow_loading_unsigned_plugin": 2, "secur": 2, "gf_auth_basic_en": 2, "fals": [2, 5, 14], "gf_auth_anonymous_en": 2, "gf_auth_anonymous_org_rol": 2, "admin": [2, 6, 7], "gf_security_admin_password": 2, "home": [2, 5], "uncom": [2, 6], "current": [2, 5, 6, 7, 10, 14, 19, 22, 24, 25, 26], "gf_dashboards_default_home_dashboard_path": 2, "ver_vers": 2, "overview": [2, 10, 25, 34], "json": [2, 12, 14], "9": [2, 6, 16, 25], "3": [2, 4, 5, 6, 14, 16, 20, 35], "11": [2, 6, 16], "3000": [2, 5, 6, 22, 24, 25, 26], "1000": [2, 33], "build": [2, 5], "plugin": 2, "persist": [2, 4, 5, 6, 7, 14, 29, 35, 37, 41], "path": [2, 5, 6, 7, 8, 10, 21, 22, 23, 24, 25, 26], "dir": [2, 7, 8, 22, 24, 25, 26], "loki": [2, 6, 9], "mnt": 2, "2": [2, 4, 5, 6, 12, 14, 16, 20, 24, 35], "7": [2, 5, 6, 14, 16], "3100": [2, 5], "rule": [2, 5, 7, 10, 19, 25, 32, 40], "conf": [2, 5, 6, 12], "promotheu": 2, "aprom": [2, 19, 25], "v2": [2, 5], "42": [2, 6], "9090": [2, 5, 8, 19, 25], "d": [2, 5, 6, 7, 8, 12, 21, 22, 23, 24, 25, 26], "prom_rul": [2, 5, 10, 12, 25], "scylla_manager_serv": [2, 5, 6, 19, 21, 23, 24, 25, 26], "node_exporter_serv": [2, 5, 6, 21, 22], "promtail": [2, 5], "1514": [2, 6], "9080": 2, "promtail_config": [2, 5], "up": [2, 5, 7, 10, 19, 21, 25, 41], "down": [2, 10, 19, 21, 22, 24, 25, 26, 28, 33, 35], "begin": [3, 11, 13, 15, 18, 42], "deploi": [3, 6], "without": [3, 6, 7, 14, 19, 21, 25, 26], "us": [3, 4, 7, 9, 10, 11, 19, 21, 22, 23, 24, 25, 26, 30, 34, 35, 37, 39, 41], "compos": [3, 7], "thano": [3, 9], "cpu": [4, 5, 6, 40], "least": [4, 5, 6, 25], "physic": [4, 5, 6], "core": [4, 5, 6, 19, 25], "4vcpu": [4, 5, 6], "15gb": [4, 5, 6], "dram": [4, 5, 6], "proport": [4, 5, 6], "number": [4, 5, 6, 8, 22, 24, 25, 33, 35, 39], "storag": [4, 5, 6, 7, 9, 14, 25], "retent": [4, 5, 6, 21, 25], "period": [4, 5, 6, 8, 10, 19, 21, 33, 39], "section": [4, 5, 6, 10, 12, 19, 21, 24, 25, 26, 41], "network": [4, 5, 6, 7, 19], "1gbe": [4, 5, 6], "10gbe": [4, 5, 6], "prefer": [4, 5, 6, 19], "perform": [4, 5, 6, 19, 25, 33, 34, 38, 41], "block": [4, 5, 6, 25], "ec2": [4, 5, 6], "eb": [4, 5, 6], "hold": [4, 5, 6, 10, 25, 30, 34, 35, 37, 41], "default": [4, 5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 25, 26, 31, 41], "15": [4, 5, 6, 21, 25], "dai": [4, 5, 6, 7, 21, 25], "around": [4, 5, 6, 19], "12mb": [4, 5, 6], "per": [4, 5, 6, 8, 12, 19, 41], "assum": [4, 5, 6, 7, 8, 10, 22, 24, 25, 26], "scrape": [4, 5, 6], "interv": [4, 5, 6, 7], "20": [4, 5, 6, 38], "node": [4, 5, 7, 12, 16, 19, 21, 28, 29, 30, 34, 35, 37, 38, 41], "cluster": [4, 5, 6, 12, 19, 25, 41], "each": [4, 5, 7, 8, 9, 10, 14, 16, 19, 26, 28, 30, 34, 39, 41], "16": [4, 5, 6, 19], "so": [4, 5, 6, 7, 8, 10, 12, 14, 19, 21, 25, 30, 41], "total": [4, 5, 6, 8, 14, 25], "96": [4, 5, 6], "time": [4, 5, 6, 7, 8, 10, 21, 23, 32, 39, 41], "need": [4, 5, 6, 7, 8, 10, 12, 14, 19, 25, 28, 29, 30, 40, 41], "16gb": [4, 5, 6], "account": [4, 5, 6], "unexpect": [4, 5, 6], "event": [4, 5, 6], "like": [4, 5, 6, 8, 9, 10, 14, 19, 36, 40, 41], "replac": [4, 5, 6, 8, 12, 14, 22, 24, 25, 26], "ad": [4, 5, 6, 7, 13], "we": [4, 5, 6, 8, 9, 12, 14, 22, 24, 25, 26, 41], "alloc": [4, 5, 6], "x2": [4, 5, 6], "case": [4, 5, 6, 7, 8, 10, 14, 19, 21, 25, 28, 33, 41], "50gb": [4, 5, 6], "doe": [4, 5, 6, 7, 8, 10, 14, 19, 39, 41], "fast": [4, 5, 6, 40], "enough": [4, 5, 6, 40], "provid": [4, 5, 6, 8], "ha": [4, 5, 6, 7, 10, 14, 19, 21, 25, 28, 34, 41], "out": [4, 5, 6, 8, 10, 40], "box": [4, 5, 6, 8], "queri": [4, 5, 6, 34, 35, 37], "over": [4, 5, 6, 25], "longer": [4, 5, 6, 14, 21, 23, 25], "durat": [4, 5, 6, 7, 10, 25], "e": [4, 5, 6, 14, 25], "g": [4, 5, 6, 7, 21, 22, 24, 25, 26], "look": [4, 5, 6, 8, 10, 12, 14, 25, 41], "week": [4, 5, 6, 7, 25], "view": [4, 5, 12], "would": [4, 5, 6, 8, 10, 14, 21, 25, 27, 30, 41], "take": [4, 5, 6, 7, 12, 14, 19, 21, 25], "than": [4, 5, 6, 10, 14, 21, 25, 41], "hourli": [4, 5, 6], "alon": [4, 5, 6], "60mb": [4, 5, 6], "about": [4, 5, 6, 10, 25, 34], "600mb": [4, 5, 6], "virtual": [4, 5, 6], "becaus": [4, 5, 6, 7, 19, 23, 35], "demand": [4, 5, 6], "good": [4, 5, 6], "idea": [4, 5, 6], "add": [4, 5, 7, 8, 10, 14, 17, 21, 26, 41], "swap": [4, 5, 6], "crash": [4, 5, 6], "nodeprometheu": [4, 5, 6], "daysprometheu": [4, 5, 6], "ramprometheu": [4, 5, 6], "00": [4, 5, 6], "instruct": [5, 6, 22, 24, 25, 26], "help": [5, 7, 10, 14, 41], "pleas": [5, 7, 19], "most": [5, 10, 14, 25, 36, 41], "common": [5, 7, 10, 41], "scenario": [5, 10], "who": [5, 7], "own": [5, 6, 7, 10, 19], "standalon": [5, 19], "thei": [5, 6, 7, 10, 14, 38, 39], "alreadi": [5, 22, 24, 25, 26], "consolid": 5, "suggest": [5, 14, 25], "those": [5, 25, 26], "offici": 5, "document": [5, 6, 8, 10, 14, 19, 21, 22, 23, 24, 25, 26], "also": [5, 6, 7, 8, 10, 14], "main": [5, 21, 39], "item": 5, "avail": [5, 6, 8, 10, 12, 13, 14, 15, 28, 41], "data": [5, 7, 9, 10, 12, 14, 21, 22, 23, 24, 26, 27, 28, 29, 30, 34, 35, 37, 38, 40, 41], "indefinit": 5, "accru": 5, "solut": [5, 8], "churn": 5, "confirm": [5, 6, 19], "befor": [5, 6, 10, 21, 22, 23, 24, 25, 26, 28, 29, 35, 41], "support": [5, 6, 14, 15, 27, 41], "want": [5, 6, 10, 22, 24, 25, 26], "latest": [5, 6, 7, 22, 24, 25, 26], "releas": [5, 21, 22, 23, 24, 25, 26], "tightli": 5, "compat": [5, 14, 19, 21, 23], "matrix": [5, 15], "cento": [5, 19], "instanc": [5, 6, 10, 12, 14, 25], "wget": [5, 6, 22, 24, 25, 26], "http": [5, 6, 8, 19, 21, 22, 24, 25, 26, 30, 31, 38], "com": [5, 6, 22, 24, 25, 26, 30, 31, 38], "archiv": [5, 6, 22, 24, 25, 26], "ref": 5, "tag": 5, "tar": [5, 6, 22, 24, 25, 26], "gz": [5, 6], "xvf": [5, 6], "test": [5, 19, 22, 41], "22": [5, 14], "linux": 5, "amd64": 5, "copi": [5, 19, 21, 22, 23, 24, 26], "file": [5, 7, 8, 10, 12, 14, 17, 21, 23, 33], "cp": [5, 22, 23, 24, 25, 26], "p": [5, 7, 8, 19, 21, 22, 24, 25, 26], "cd": [5, 6, 22, 24, 25, 26], "verifi": [5, 10, 23], "point": [5, 6, 14, 22, 24, 25, 26], "browser": [5, 6, 8, 14, 19, 22, 24, 25, 26], "192": [5, 6], "168": [5, 6], "135": 5, "166": 5, "log": [5, 6, 8, 9, 19, 25], "aggreg": [5, 12], "inspir": 5, "central": [5, 9], "check": [5, 10, 19, 22, 24, 25, 26, 36, 37, 41], "recomand": 5, "local": [5, 6, 7, 8, 9, 14, 19, 22, 24, 25, 26, 41], "describ": [5, 6, 8, 17, 19, 41], "respons": [5, 10], "pars": [5, 9, 14, 32, 41], "act": [5, 6, 8, 10], "proemtheu": 5, "sent": [5, 10, 35, 37], "load": [5, 6, 10, 12, 19, 25, 27, 30, 31, 41], "multipl": [5, 6, 7, 8, 9, 10, 14, 28, 31, 32, 38, 40, 41], "do": [5, 6, 7, 14, 19, 21, 22, 23, 24, 25, 26, 30, 33, 41], "rsyslog": [5, 9], "second": [5, 6, 10, 12, 19, 21, 22, 24, 26], "relat": [5, 41], "modifi": [5, 13], "mkdir": 5, "templat": [5, 6, 8, 19, 21, 41], "edit": [5, 6, 7, 8, 12, 14, 19], "localhost": [5, 7, 25], "loki_ip": 5, "": [5, 6, 7, 9, 10, 12, 14, 27, 28, 36, 39, 41], "27": [5, 6, 14], "If": [5, 6, 7, 8, 12, 14, 19, 21, 23, 25, 26, 33, 36, 38, 39, 40, 41], "besid": [5, 7, 21, 41], "expect": [5, 10, 22, 24, 25, 26], "scrap": [5, 7, 12], "job": [5, 6, 19], "onli": [5, 6, 7, 12, 19, 21, 23, 25, 30, 32, 33, 39, 41], "import": [5, 6, 7, 10, 12, 21, 22, 24, 25, 26, 33], "record": [5, 7, 19, 25], "asspect": 5, "work": [5, 6, 7, 8, 10, 12, 14, 21, 22, 24, 25, 26], "code": [5, 34], "shell": 5, "correct": [5, 23, 41], "static": [5, 33], "honor_label": 5, "paramet": [5, 7], "vi": 5, "alertmang": 5, "am_address": 5, "same": [5, 6, 21, 26], "host": [5, 6, 7, 9, 19, 26], "static_config": [5, 6], "target": [5, 7, 14, 17, 19, 21, 23, 26], "127": [5, 7, 19], "right": [5, 6, 14, 41], "typic": [5, 14, 25, 28, 30, 39, 41], "node_export": [5, 6, 7, 9, 16, 26], "manager_ag": 5, "global": [5, 6], "scrape_interv": [5, 6], "5": [5, 6, 14, 16, 19, 26], "By": [5, 6, 7, 10, 12, 14, 17, 19, 21, 23, 31, 41], "everi": [5, 6, 7, 25], "scrape_timeout": 5, "timeout": [5, 40], "try": [5, 19], "scape": 5, "again": [5, 6], "attach": 5, "label": [5, 6, 8, 10, 25], "ani": [5, 6, 10, 14, 19, 34, 41], "seri": [5, 8], "commun": [5, 18], "feder": 5, "remot": 5, "external_label": [5, 21], "scrape_config": [5, 21], "job_nam": [5, 6], "file_sd_config": 5, "relabel_config": 5, "source_label": 5, "__address__": 5, "regex": 5, "target_label": 5, "9180": [5, 17, 19], "There": [5, 6, 8, 10, 13, 14, 15, 25, 38, 40, 42], "instead": [5, 6, 8, 19, 25, 41], "found": [5, 6, 7, 10, 14], "must": [5, 6, 12, 35], "even": [5, 6, 7, 19], "center": [5, 6, 8, 41], "cat": 5, "list": [5, 6], "end": [5, 6, 10, 21, 41], "66": [5, 19], "244": 5, "cluster1": [5, 6], "dc": [5, 6, 8, 12, 25], "dc1": [5, 6], "172": [5, 6, 19], "17": [5, 6, 16, 19, 23], "dc2": [5, 6], "previou": [5, 24, 25, 26], "deprec": 5, "5090": [5, 6, 19], "tsdb": [5, 7, 8, 25], "accumul": 5, "consol": [5, 19], "visibl": [5, 12], "execut": [5, 7, 27, 32], "through": 5, "node_memory_memfre": 5, "And": [5, 14, 22, 24, 26], "scylla_reactor_util": 5, "At": [5, 14, 24, 25, 26], "emit": 5, "abl": [5, 8, 21, 23, 25], "them": [5, 7, 9, 10, 14, 23, 34], "grafna": 5, "here": [5, 6, 7, 10, 21], "depend": [5, 8, 25], "repositori": [5, 6], "yum": 5, "zip": [5, 22, 24, 25, 26], "structur": 5, "rest": [5, 8, 25], "access": [5, 7], "sudo": [5, 6, 19], "r": [5, 7, 14, 19], "packag": 5, "public": 5, "app": 5, "insid": [5, 6, 7, 14, 19], "provis": [5, 14], "manager_2": 5, "ver_4": 5, "A": [5, 7, 8, 9, 14, 28, 29, 35, 39, 41], "folder": 5, "name": [5, 6, 8, 10, 19, 23, 41], "otherwis": 5, "some": [5, 8, 10, 12, 19, 25, 34, 38], "tabl": [5, 6, 10, 16, 27, 34, 41], "apivers": 5, "type": [5, 14, 41], "url": [5, 8, 21, 25], "167": 5, "proxi": 5, "basicauth": 5, "camptocamp": 5, "orgid": 5, "typelogourl": 5, "img": 5, "icn": 5, "svg": 5, "password": [5, 6, 7], "isdefault": 5, "jsondata": 5, "severity_crit": 5, "severity_high": 5, "severity_warn": 5, "severity_info": 5, "sampl": 5, "ini": 5, "reflect": 5, "bin": 5, "assumpt": 5, "colloc": 5, "cql": [5, 6, 9, 34, 42], "connect": [5, 8, 14, 17, 19], "between": [5, 8, 12, 19, 21, 22, 24, 25, 26, 33, 41], "give": [5, 13, 15], "strongli": [5, 41], "encourag": 5, "restrict": [5, 17], "keyspac": [5, 6], "part": [5, 6, 10, 23, 27, 30, 41], "option": [5, 6, 8, 9, 12, 19, 21, 25, 33], "highli": 5, "author": [5, 6, 7], "cover": [5, 7, 14, 21], "detail": [5, 10, 33, 34], "done": [5, 6, 7, 14, 19, 25], "first": [5, 12, 22, 24, 25, 26, 41], "new": [5, 6, 12, 19, 39], "roll": 5, "role": [5, 7], "scylla_monitor": 5, "WITH": [5, 41], "AND": 5, "login": [5, 6, 19], "proper": [5, 12, 19], "select": [5, 34, 41], "permiss": [5, 6, 21], "grant": 5, "TO": 5, "entri": 5, "securejsondata": [5, 6], "As": [5, 6, 14, 26, 32, 33], "mention": [5, 14], "previous": [5, 24, 25, 26], "safer": [5, 41], "dedic": [5, 6], "limit": [5, 6, 8, 10, 31, 33, 41], "privileg": [5, 6, 7, 25], "un": [5, 25], "comment": 5, "relev": [5, 7, 25, 34], "usernam": 5, "unsign": 5, "allow_loading_unsigned_plugin": 5, "setup": 6, "pull": [6, 19], "evalu": [6, 7, 25], "laptop": 6, "48": 6, "10": [6, 10, 14, 16], "47": 6, "44": 6, "8": [6, 16, 19, 21, 25], "41": 6, "38": 6, "34": 6, "32": 6, "29": 6, "25": [6, 19], "18": 6, "avoid": [6, 14, 19, 31, 41], "root": [6, 19, 22, 24, 25, 26], "go": [6, 12, 19], "group": [6, 10], "groupadd": 6, "activ": [6, 10], "next": [6, 7, 8, 10, 22, 24, 25, 26], "usermod": 6, "ag": 6, "systemctl": 6, "enabl": [6, 8, 12, 19, 21], "extract": 6, "binari": [6, 19], "clone": 6, "git": 6, "directli": [6, 9, 12], "checkout": 6, "restart": [6, 7, 8, 12, 21], "know": [6, 19, 30, 41], "higher": [6, 10, 25, 30, 41], "wish": [6, 7], "match": [6, 41], "datacent": 6, "nodetool": 6, "statu": [6, 19, 25], "valid": 6, "ipv6": 6, "squar": 6, "bracket": 6, "2600": 6, "1f18": 6, "26b1": 6, "3a00": 6, "fac8": 6, "118e": 6, "9199": 6, "67b9": 6, "67ba": 6, "web": [6, 8, 21], "listen": [6, 7, 17, 21], "set": [6, 7, 10, 14, 17, 33], "inform": [6, 7, 13, 14, 15, 17, 25, 27, 28, 29], "agent": [6, 7, 8, 9, 16, 19, 26], "machin": [6, 7, 12, 19, 23], "overrid": [6, 7, 14], "n": [6, 7, 26], "my_scylla_serv": 6, "prometheus_data": 6, "mark": 6, "seen": 6, "genconfig": 6, "py": [6, 14], "myconf": 6, "four": 6, "OR": 6, "l": [6, 7, 19, 22, 24, 25, 26], "within": [6, 10, 14], "protect": 6, "assign": 6, "variabl": [6, 7], "scylla_us": 6, "scylla_psswd": 6, "best": [6, 38], "place": [6, 7, 8, 10, 12, 14, 41], "outsid": [6, 7, 21], "result": [6, 7, 21, 28, 30, 31, 33, 39, 41], "lost": [6, 7, 14, 41], "exist": [6, 10, 14, 41], "somewher": 6, "els": [6, 7], "situat": [6, 7, 10, 33, 41], "firewal": [6, 19], "7000": [6, 19], "myservic": 6, "m": [6, 7, 21, 22, 24, 25, 26], "2019": [6, 16, 38], "reach": [6, 8, 12, 30, 33, 35, 41], "function": [6, 8], "featur": [6, 8], "direct": 6, "send": [6, 10, 30, 31, 35, 37, 41], "programnam": 6, "rsyslog_syslogprotocol23format": 6, "effect": [6, 14, 19], "authent": [6, 7], "disabl": [6, 17, 19], "simplest": 7, "small": [7, 39], "util": [7, 14, 23, 25], "appropri": 7, "h": [7, 14], "print": 7, "exit": 7, "applic": 7, "cannot": [7, 12, 25, 35, 40], "map": 7, "bind": [7, 17], "explicit": 7, "encapsul": 7, "param": 7, "allow": [7, 9, 21, 25, 29, 32, 34], "addit": [7, 8, 9, 10, 13, 15, 25, 41], "specif": [7, 10, 12, 17, 19, 36, 41], "driver": [7, 30, 31, 38, 41], "net": 7, "network_nam": 7, "auto": 7, "automat": 7, "failur": [7, 19, 40], "experiment": 7, "initi": 7, "stage": 7, "process": [7, 21, 33, 40], "firstli": 7, "along": 7, "env": 7, "prerequisit": 7, "gui": [7, 14, 19], "keep": [7, 21, 25], "clear": 7, "comma": 7, "separ": [7, 10], "come": [7, 10], "j": 7, "c": 7, "alter": 7, "q": 7, "anonym": 7, "That": [7, 10, 14, 25], "mean": [7, 14, 21, 27, 28, 29, 30, 31, 35, 37, 41], "chang": [7, 14, 17, 19, 21, 22, 23, 24, 25, 26], "behavior": 7, "editor": 7, "viewer": 7, "suppli": [7, 14], "b": [7, 25], "o": [7, 16, 23, 26, 34], "disk": [7, 10, 14, 19, 27, 29, 34], "possibl": [7, 10, 17, 41], "api": [7, 8, 21], "resolv": 7, "explicitli": [7, 14], "ca": 7, "optim": [7, 32, 38, 42], "drop": [7, 40, 41], "while": [7, 10, 19, 21, 22, 24, 25, 26, 33], "cdc": 7, "request": [7, 17, 40], "how": [7, 8, 10, 14, 22, 24, 25, 26, 28, 29, 30, 34, 41], "someth": [7, 10, 11, 14, 25, 39], "opportun": 7, "demonstr": 7, "30": [7, 10], "30d": 7, "anoth": [7, 10], "arbitrari": 7, "opensourc": 8, "top": 8, "high": [8, 10, 14, 19], "horizont": 8, "scale": [8, 40], "backup": 8, "benefit": [8, 41], "flexibl": 8, "design": 8, "front": 8, "few": [8, 9, 22, 24, 25, 26], "reason": [8, 14, 19, 25, 37, 41], "why": 8, "million": 8, "singl": [8, 14], "capac": 8, "sometim": 8, "traffic": [8, 19, 38, 41], "reachabl": [8, 21], "lifecycl": 8, "z": 8, "thanosio": 8, "grpc": 8, "10911": 8, "grace": 8, "10912": 8, "after": [8, 14, 21, 22, 24, 25, 26, 29], "expos": [8, 17, 21], "togeth": 8, "ip1": 8, "ip2": 8, "debug": 8, "query0": 8, "level": [8, 34], "10903": 8, "10904": 8, "replica": [8, 28, 29, 30, 34, 35, 41], "abov": [8, 22, 24, 25, 26], "last": [8, 25], "db_address": 8, "could": [8, 34, 38, 40, 41], "long": [8, 10, 25, 39], "now": [8, 10, 25], "grafan": 9, "render": [9, 14], "sidecar": 9, "db": 9, "receiv": [9, 10, 41], "distribut": [9, 30, 38, 41], "email": [9, 10], "slack": [9, 10, 18], "displai": [9, 12, 23], "enhanc": [10, 11], "notifi": [10, 11], "wrong": [10, 11, 14, 19, 25, 26, 39, 41], "shown": [10, 19, 22, 24, 25, 26], "condit": 10, "met": 10, "certain": 10, "defin": [10, 14, 21, 41], "what": [10, 25], "happen": [10, 19], "report": [10, 16, 19, 41], "let": [10, 21, 26], "u": 10, "instancedown": 10, "expr": [10, 14, 25], "60": [10, 25], "error": [10, 14, 25, 34, 35, 37], "annot": 10, "descript": [10, 34], "been": [10, 12], "summari": 10, "legal": 10, "express": 10, "equal": 10, "minim": 10, "prior": 10, "pend": 10, "mode": [10, 14, 22], "special": 10, "notif": 10, "forward": 10, "low": [10, 41], "info": 10, "warn": [10, 34], "critic": 10, "inhibit": 10, "prioriti": 10, "mute": 10, "lower": [10, 41], "space": 10, "threshold": 10, "fire": 10, "silenc": 10, "signal": 10, "action": 10, "pager": 10, "duti": 10, "extens": 10, "easier": [10, 14], "dure": [10, 19, 22, 24, 25, 26], "practic": [10, 34, 38], "suitabl": 10, "rememb": 10, "overridden": [10, 14], "duplic": [10, 41], "rout": [10, 30, 41], "repres": 10, "tree": 10, "win": [10, 19], "via": [10, 19], "sluck": 10, "wors": 10, "correctli": [10, 14, 21, 23], "mail": 10, "simpl": 10, "negat": 10, "logic": 10, "forc": [10, 23, 25], "reduc": [10, 14, 28], "simul": 10, "actual": [10, 37], "show": [10, 14, 16, 25, 41], "propag": 10, "valu": [10, 14, 32, 33, 39, 41], "similar": [10, 14], "free": 10, "big": [10, 41], "bisect": 10, "problem": [10, 34, 40, 41], "safest": 12, "move": 12, "id": [12, 14, 19], "cluster_id": 12, "token": [12, 34], "shard": [12, 19, 25, 34], "dd": 12, "non": [12, 19, 21, 29, 30, 34, 38, 41], "cost": [12, 41], "skip": [12, 25], "care": [12, 27, 28, 29, 41], "resembl": [12, 14], "filter": [12, 34], "perspect": 12, "graph": [12, 14, 21, 23, 25, 41], "pai": 12, "attent": 12, "combin": 12, "conflict": 12, "remov": [12, 21], "sever": [13, 15, 42], "explain": [14, 22, 24, 25, 26, 34], "intern": [14, 30, 41], "potenti": [14, 34, 41], "issu": [14, 19, 34, 38, 41], "whenev": 14, "save": 14, "earlier": 14, "perman": 14, "eventu": 14, "made": 14, "larg": [14, 34], "maintain": 14, "too": [14, 33, 39], "verbos": 14, "element": [14, 34], "object": 14, "attribut": 14, "aliascolor": 14, "bar": 14, "fill": [14, 40], "grid": 14, "threshold1": 14, "null": 14, "threshold1color": 14, "rgba": 14, "216": 14, "200": 14, "threshold2": 14, "threshold2color": 14, "234": 14, "112": 14, "gridpo": 14, "w": [14, 19], "x": [14, 19, 20], "y": [14, 20], "isnew": 14, "legend": 14, "avg": 14, "max": 14, "min": 14, "linewidth": 14, "link": [14, 34], "nullpointmod": 14, "percentag": [14, 41], "pointradiu": 14, "flot": 14, "seriesoverrid": 14, "span": 14, "steppedlin": 14, "sum": [14, 25], "node_filesystem_avail": 14, "intervalfactor": 14, "legendformat": 14, "refid": 14, "timefrom": 14, "timeshift": 14, "titl": 14, "size": [14, 31, 41], "tooltip": 14, "msresolut": 14, "share": [14, 26, 33], "sort": [14, 41], "value_typ": 14, "cumul": 14, "transpar": 14, "xaxi": 14, "yax": 14, "percent": 14, "logbas": 14, "101": 14, "short": 14, "imagin": 14, "redund": 14, "css": 14, "hierarch": 14, "definit": [14, 21, 41], "inherit": 14, "row": [14, 41], "base_row": 14, "collaps": 14, "height": 14, "250px": 14, "Will": 14, "150px": 14, "output": 14, "consid": 14, "bytes_panel": 14, "byte": 14, "unit": 14, "axi": 14, "adjust": 14, "readabl": 14, "gb": 14, "mb": 14, "grasp": 14, "origin": [14, 25, 36], "12": [14, 19, 25], "wa": [14, 41], "larger": 14, "break": [14, 31, 41], "later": 14, "were": [14, 21, 41], "absolut": 14, "posit": 14, "width": 14, "backward": [14, 19, 21, 23], "ve": 14, "had": 14, "imposs": 14, "hand": 14, "overcom": 14, "transit": [14, 19, 23, 25], "calcul": [14, 19, 25], "taken": [14, 21], "still": [14, 25], "unlik": 14, "partial": 14, "don": [14, 25], "python": 14, "make_dashboard": 14, "revers": 14, "usual": [14, 19, 34, 41], "wrapper": 14, "re": [14, 30], "just": 14, "refresh": 14, "generate_gener": 14, "ran": 14, "mayb": 14, "interfac": [15, 19], "2021": 16, "2022": 16, "2023": 16, "2024": 16, "2018": [16, 31], "14": [16, 19], "onlin": 17, "prometheus_port": 17, "prometheus_address": 17, "integr": 18, "ask": 18, "question": 18, "discuss": 18, "forum": 18, "channel": 18, "56090": 19, "old": [19, 22, 23, 24, 25, 26], "howev": 19, "twice": 19, "easiest": 19, "scylla_manager1": 19, "messag": 19, "wait": [19, 35], "post": 19, "past": [19, 23], "mai": [19, 33, 35, 41], "ownership": 19, "la": 19, "grep": 19, "drwxr": 19, "xr": 19, "4096": 19, "jun": 19, "51": 19, "chown": 19, "appear": 19, "unreach": [19, 35], "immedi": 19, "suspect": 19, "tab": 19, "rang": [19, 25, 41], "align": 19, "On": 19, "41bd3db26240": 19, "entrypoin": 19, "ago": [19, 25], "23": 19, "7001": 19, "tcp": 19, "9042": 19, "9160": 19, "10000": 19, "click": 19, "usag": [19, 30, 41], "fetch": 19, "curl": 19, "scylla_nod": 19, "return": [19, 21, 27, 28, 29, 31, 35, 37, 41], "ef": 19, "gre": 19, "scylla_setup": 19, "9100": 19, "fallback": 19, "mechan": [19, 25, 28], "present": [19, 25], "newer": [19, 24, 25, 26], "reli": [19, 25, 41], "miss": [19, 25], "clean": 19, "recommend": [19, 22, 24, 25, 26, 41], "increas": [19, 31, 33, 41], "might": [19, 39], "overload": 19, "datadog": 19, "sysconfig": 19, "export": 19, "collector": 19, "captur": 19, "tshark": 19, "f": 19, "dst": 19, "eth0": 19, "toward": 19, "199": 19, "203": 19, "229": 19, "89": 19, "142": 19, "59212": 19, "ack": 19, "seq": 19, "317": 19, "78193": 19, "158080": 19, "len": 19, "tsval": 19, "79869679": 19, "tsecr": 19, "3347447210": 19, "74": 19, "60440": 19, "syn": 19, "29200": 19, "mss": 19, "1460": 19, "sack_perm": 19, "79988291": 19, "128": 19, "sinc": 21, "parallel": [21, 22, 24, 25, 26], "migrat": [21, 22, 24, 26], "lose": 21, "histor": [21, 25], "safe": 21, "page": [21, 23, 34], "unzip": [21, 22, 23, 24, 25, 26], "3001": [21, 22, 24, 25, 26], "9091": [21, 22, 24, 25, 26], "9094": 21, "fail": [21, 28, 30, 34, 41], "loss": 21, "everyth": 21, "stop": [21, 22, 23, 24, 25, 26], "format": [21, 25], "rule_fil": 21, "9111": 21, "phase": [21, 23], "serv": 21, "remote_read": 21, "v1": 21, "histori": [21, 23], "continu": [21, 22, 24, 25, 26], "back": [21, 28], "uninstal": [22, 24, 25, 26], "minor": [22, 24, 25, 26], "9095": [22, 24, 25, 26], "brows": [22, 24, 25, 26], "satisfi": [22, 24, 25, 26], "shut": [22, 24, 25, 26], "caus": [22, 24, 25, 26, 30, 41], "blackout": [22, 24, 25, 26], "normal": [22, 24, 25, 26], "oper": [22, 24, 25, 26, 34, 41], "complet": [22, 24, 25, 26], "switch": [23, 25], "fulli": 23, "affect": 23, "older": [23, 24, 25, 26], "helper": 23, "node_exporter_instal": 23, "ship": 23, "sub": 23, "color": 23, "simpli": 23, "side": [24, 25, 26, 27, 34, 41], "ensur": 25, "patch": 25, "entir": 25, "promethu": 25, "p99": 25, "write": [25, 29], "latenc": [25, 30, 33, 41], "wlatencyp99": 25, "histogram_quantil": 25, "99": 25, "rate": [25, 41], "scylla_storage_proxy_coordinator_write_latency_bucket": 25, "scheduling_group_nam": 25, "le": 25, "fall": [25, 28], "year": 25, "month": 25, "360": 25, "our": 25, "nine": 25, "gap": 25, "minu": 25, "exact": 25, "goe": 25, "revert": 25, "stat": 25, "overlap": 25, "promtool": 25, "90": 25, "epoc": 25, "translat": 25, "mani": [25, 28, 29, 41], "echo": 25, "date": 25, "3600": 25, "exec": 25, "back_fil": 25, "took": 25, "hour": 25, "100": [25, 33, 40], "creation": 25, "inerupt": 25, "split": 25, "smaller": 25, "successfulli": 25, "compact": [25, 40], "half": 25, "itself": 26, "almost": 26, "alwai": [26, 32], "sylladb": 26, "prevent": [26, 41], "primari": [27, 41], "kei": [27, 41], "scan": 27, "These": [27, 41], "kind": [27, 41], "bigger": 27, "replicationfactor": [28, 29], "piec": 28, "determin": [28, 29, 35, 41], "repli": [28, 29, 31, 35, 37, 41], "unavail": [28, 41], "client": [28, 31, 34, 41], "respond": 28, "accompani": 28, "deep": 28, "understand": 28, "acknowledg": 29, "coordin": [29, 30, 35, 37, 41], "hint": 29, "fact": 29, "yet": 29, "ideal": [30, 41], "resourc": [30, 41], "replic": [30, 35, 37, 41], "prepar": [30, 34, 38], "statement": [30, 32, 34, 38], "balanc": [30, 33, 34, 41], "polici": 30, "cours": 30, "intro": 30, "recap": 30, "ring": [30, 41], "architectur": 30, "chunk": [31, 41], "overal": [31, 33, 41], "thu": 31, "www": [31, 38], "07": 31, "13": 31, "effici": [31, 41], "concret": 32, "thumb": 32, "favor": 32, "background": [33, 40], "much": [33, 41], "impact": [33, 34], "compaction_static_shar": 33, "50": 33, "indic": [33, 34, 39, 40, 41], "overli": 33, "slow": 33, "enforc": 33, "min_threshold": 33, "compaction_enforce_min_threshold": 33, "bucket": 33, "sstabl": 33, "stc": 33, "recogn": 34, "bad": 34, "solv": 34, "categori": [34, 41], "jump": 34, "cell": 34, "model": [34, 38, 40, 41], "awar": 34, "due": 34, "unsatisfi": 34, "faulti": 34, "cach": 34, "evict": 34, "answer": [35, 37], "aka": 35, "factor": 35, "quorum": [35, 41], "hardwar": [36, 40], "occur": 36, "leav": 37, "risk": 37, "identifi": [37, 41], "evenli": 38, "across": 38, "becom": 38, "bottleneck": 38, "explan": 38, "08": 38, "field": 39, "being": 39, "defi": 39, "purpos": 39, "shed": 40, "repair": 40, "queue": 40, "upper": 41, "gaug": 41, "inspect": 41, "zero": 41, "mislead": 41, "panel": 41, "holder": 41, "inject": 41, "did": 41, "compound": 41, "column": 41, "order": 41, "BY": 41, "ks1": 41, "table_demo": 41, "text": 41, "int": 41, "desc": 41, "cat1": 41, "asc": 41, "overhead": 41, "thing": 41, "major": 41, "success": 41, "hurt": 41, "cl": 41, "expens": 41, "term": 41, "ONE": 41, "local_quorum": 41, "local_on": 41, "nearest": 41, "advisor": 42}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"scylladb": [1, 6, 9, 13, 26], "monitor": [1, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 34, 42], "stack": [1, 3, 5, 6, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26, 34, 42], "us": [2, 5, 6, 8, 12, 14, 27, 28, 29, 42], "docker": [2, 5, 6], "compos": 2, "prerequisit": [2, 6, 14], "set": [2, 5, 21, 22, 24, 25, 26], "prometheu": [2, 4, 5, 6, 7, 8, 10, 17, 21], "grafana": [2, 5, 6, 7, 14, 19], "provis": 2, "data": [2, 6, 8, 19, 25], "sourc": [2, 8, 19], "file": [2, 6, 19, 22, 24, 25, 26], "dashboard": [2, 6, 12, 14], "load": 2, "start": [2, 6, 7, 19, 25], "stop": [2, 6], "download": 3, "instal": [3, 5, 6, 12, 21, 22, 23, 24, 25, 26], "scylla": [3, 5, 6, 8, 11, 12, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 28, 29, 34, 42], "minim": [4, 5, 6], "product": [4, 5, 6], "system": [4, 5, 6, 14, 21, 40], "recommend": [4, 5, 6], "calcul": [4, 5, 6], "disk": [4, 5, 6, 36], "space": [4, 5, 6], "requir": [4, 5, 6], "memori": [4, 5, 6, 33], "deploi": 5, "without": 5, "introduct": 5, "alertmanag": [5, 10], "loki": 5, "plugin": 5, "user": [5, 12, 19], "configur": [5, 6, 8, 12], "enabl": 5, "compat": 6, "matrix": [6, 16], "post": [6, 12, 25, 31, 38], "node": [6, 36], "from": [6, 14, 19], "manag": [6, 7, 11, 19], "consul": 6, "api": [6, 17], "connect": 6, "an": [6, 10], "extern": 6, "directori": [6, 19], "add": [6, 12], "addit": 6, "target": 6, "specif": 6, "version": [6, 21, 22, 23, 24, 25, 26], "access": 6, "localhost": 6, "rsyslog": 6, "each": 6, "view": 6, "The": [7, 14, 22, 24, 25, 26, 34, 41], "all": [7, 22, 24, 25, 26, 28], "sh": [7, 14], "command": 7, "gener": [7, 14], "option": 7, "relat": [7, 21, 22, 23, 24, 25, 26], "ldap": 7, "support": [7, 16], "retent": 7, "period": [7, 25], "alert": [7, 10, 11, 21], "thano": 8, "With": 8, "As": 8, "aggreg": 8, "sidecar": 8, "queri": [8, 27, 28, 29, 30, 31, 32, 38, 41], "updat": 8, "high": 9, "level": [9, 19, 28, 29, 35, 41], "architectur": 9, "sever": 10, "ad": [10, 12, 14], "modifi": [10, 14], "tip": 10, "when": 10, "datadog": 12, "integr": 12, "And": [12, 19], "agent": 12, "cloud": 12, "other": 12, "record": 12, "rule": [12, 21], "upload": 12, "procedur": [13, 21, 22, 23, 24, 25, 26], "limit": 14, "consist": [14, 28, 29, 35, 41], "between": 14, "restart": [14, 25], "upgrad": [14, 19, 20, 21, 22, 23, 24, 25, 26], "templat": 14, "class": 14, "panel": 14, "exampl": 14, "format": 14, "layout": 14, "valid": [14, 21, 22, 23, 24, 25, 26], "refer": 15, "guid": [15, 18, 21, 22, 23, 24, 25, 26], "interfac": 17, "troubleshoot": [18, 19], "problem": 19, "2": [19, 21, 22, 23], "duplic": 19, "inform": 19, "A": 19, "contain": [19, 22, 24, 25, 26], "fail": [19, 35, 37], "To": 19, "permiss": 19, "No": 19, "point": 19, "solut": 19, "chart": 19, "show": 19, "error": [19, 36], "sign": 19, "server": [19, 22, 24, 25, 26], "metric": [19, 25], "notic": 19, "open": 19, "3": [19, 21, 23, 24, 25], "0": 19, "enterpris": 19, "2019": 19, "1": [19, 21, 23], "latenc": 19, "graph": 19, "ar": [19, 30, 31, 32, 38], "empti": 19, "reduc": 19, "total": 19, "number": [19, 26], "remov": 19, "interrupt": 19, "node_export": [19, 23], "work": 19, "wireshark": 19, "x": [21, 22, 23, 24, 25, 26], "latest": 21, "new": [21, 22, 23, 24, 25, 26], "4": [21, 25, 26], "move": [21, 22, 24, 25, 26], "old": 21, "b": [21, 26], "rollback": [21, 22, 23, 24, 25, 26], "link": [21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 38], "y": [22, 24, 25, 26], "": [22, 24, 25, 26], "i": [22, 24, 25, 26, 36], "run": [22, 24, 25, 26], "correct": [22, 24, 25, 26], "correctli": [22, 24, 26], "kill": [22, 24, 25, 26], "test": [24, 25, 26], "mode": [24, 25, 26], "second": 25, "migrat": 25, "backup": 25, "back": 25, "fill": 25, "determin": 25, "backfil": 25, "time": 25, "end": 25, "process": 25, "creat": 25, "copi": 25, "port": 26, "some": [27, 28, 29, 30, 31, 32, 35, 37], "allow": [27, 41], "filter": [27, 41], "univers": [28, 29, 30], "ani": 29, "token": [30, 41], "awar": [30, 41], "select": 31, "non": [31, 32], "page": [31, 41], "blog": [31, 38], "prepar": [32, 39, 41], "compact": 33, "take": 33, "lot": 33, "cpu": 33, "advisor": 34, "section": 34, "oper": [35, 37], "due": 35, "unsatisfi": 35, "o": 36, "can": 36, "indic": 36, "faulti": 36, "replica": 37, "side": 37, "cql": [38, 41], "balanc": 38, "among": 38, "shard": 38, "statement": [39, 41], "cach": 39, "evict": 39, "overload": 40, "optim": 41, "revers": 41, "read": 41, "cross": 41, "dc": 41, "request": 41}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Some SELECT queries are non-paged": [[31, "some-select-queries-are-non-paged"]], "Blog-post Links": [[31, "blog-post-links"]], "I/O Errors can indicate a node with a faulty disk": [[36, "i-o-errors-can-indicate-a-node-with-a-faulty-disk"]], "Some queries are non-prepared": [[32, "some-queries-are-non-prepared"]], "Some operation failed due to unsatisfied consistency level": [[35, "some-operation-failed-due-to-unsatisfied-consistency-level"]], "Some operations failed on the replica side": [[37, "some-operations-failed-on-the-replica-side"]], "Prepared statements cache eviction": [[39, "prepared-statements-cache-eviction"]], "CQL queries are not balanced among shards": [[38, "cql-queries-are-not-balanced-among-shards"]], "Blog post link": [[38, "blog-post-link"]], "Compaction takes lots of memory and CPU": [[33, "compaction-takes-lots-of-memory-and-cpu"]], "Some queries are not token-aware": [[30, "some-queries-are-not-token-aware"]], "University link": [[30, "university-link"]], "Scylla Monitoring Stack Advisor": [[34, "scylla-monitoring-stack-advisor"]], "The Advisor section": [[34, "the-advisor-section"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y": [[24, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-3-y"]], "Upgrade Procedure": [[24, "upgrade-procedure"], [26, "upgrade-procedure"], [22, "upgrade-procedure"], [25, "upgrade-procedure"], [23, "upgrade-procedure"], [21, "upgrade-procedure"]], "Install 3.y (The new version)": [[24, "install-3-y-the-new-version"]], "Setting the server\u2019s files": [[24, "setting-the-server-s-files"], [26, "setting-the-server-s-files"], [22, "setting-the-server-s-files"], [25, "setting-the-server-s-files"]], "Validate the new version is running the correct version": [[24, "validate-the-new-version-is-running-the-correct-version"], [26, "validate-the-new-version-is-running-the-correct-version"], [22, "validate-the-new-version-is-running-the-correct-version"], [25, "validate-the-new-version-is-running-the-correct-version"]], "Validate the version installed correctly": [[24, "validate-the-version-installed-correctly"], [26, "validate-the-version-installed-correctly"], [22, "validate-the-version-installed-correctly"]], "Killing the new 3.y Monitoring stack in testing mode": [[24, "killing-the-new-3-y-monitoring-stack-in-testing-mode"]], "Move to version 3.y (the new version)": [[24, "move-to-version-3-y-the-new-version"]], "Kill all containers": [[24, "kill-all-containers"], [26, "kill-all-containers"], [22, "kill-all-containers"], [25, "kill-all-containers"]], "Rollback to version 3.x": [[24, "rollback-to-version-3-x"], [25, "rollback-to-version-3-x"]], "Related Links": [[24, "related-links"], [26, "related-links"], [22, "related-links"], [25, "related-links"], [23, "related-links"], [21, "related-links"]], "Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b": [[26, "upgrade-guide-scylladb-monitoring-4-x-a-to-scylladb-monitoring-4-y-b"]], "Install 4.y.b (The new version)": [[26, "install-4-y-b-the-new-version"]], "Validate the port numbers": [[26, "validate-the-port-numbers"]], "Killing the new 4.y.b Monitoring stack in testing mode": [[26, "killing-the-new-4-y-b-monitoring-stack-in-testing-mode"]], "Move to version 4.y.b (the new version)": [[26, "move-to-version-4-y-b-the-new-version"]], "Rollback to version 4.x.a": [[26, "rollback-to-version-4-x-a"]], "Some queries use ALLOW FILTERING": [[27, "some-queries-use-allow-filtering"]], "Some queries use Consistency Level: ALL": [[28, "some-queries-use-consistency-level-all"]], "Link to Scylla university": [[28, "link-to-scylla-university"], [29, "link-to-scylla-university"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y": [[22, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-2-y"]], "Install 2.y (The new version)": [[22, "install-2-y-the-new-version"]], "Move to version 2.y (the new version)": [[22, "move-to-version-2-y-the-new-version"]], "Rollback to version 2.x": [[22, "rollback-to-version-2-x"]], "Some queries use Consistency Level: ANY": [[29, "some-queries-use-consistency-level-any"]], "Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y": [[25, "upgrade-guide-scylla-monitoring-3-x-to-scylla-monitoring-4-y"]], "Install 4.y (The new version)": [[25, "install-4-y-the-new-version"]], "Running in test mode": [[25, "running-in-test-mode"]], "Running second monitoring stack": [[25, "running-second-monitoring-stack"]], "Killing the new 4.y Monitoring stack in testing mode": [[25, "killing-the-new-4-y-monitoring-stack-in-testing-mode"]], "Migrating": [[25, "migrating"]], "Move to version 4.y (the new version)": [[25, "move-to-version-4-y-the-new-version"]], "Backup": [[25, "backup"]], "Post-installation: Metrics back-filling": [[25, "post-installation-metrics-back-filling"]], "Determine the backfilling period": [[25, "determine-the-backfilling-period"]], "Determine the start time": [[25, "determine-the-start-time"]], "Determine the end time": [[25, "determine-the-end-time"]], "Backfilling Process": [[25, "backfilling-process"]], "backup": [[25, "id1"]], "Restart the monitoring stack": [[25, "restart-the-monitoring-stack"]], "Create the data files": [[25, "create-the-data-files"]], "Copy the data files": [[25, "copy-the-data-files"]], "Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x": [[23, "upgrade-guide-scylla-monitoring-2-x-to-scylla-monitoring-3-x"]], "1. Validate node_exporter version": [[23, "validate-node-exporter-version"]], "2. Install the new monitoring stack": [[23, "install-the-new-monitoring-stack"], [21, "install-the-new-monitoring-stack"]], "Validate the upgrade": [[23, "validate-the-upgrade"], [21, "validate-the-upgrade"]], "Rollback": [[23, "rollback"], [21, "rollback"]], "Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x": [[21, "upgrade-guide-scylla-monitoring-1-x-to-scylla-monitoring-2-x"]], "1. Upgrade to the latest 1.x version": [[21, "upgrade-to-the-latest-1-x-version"]], "Validation": [[21, "validation"], [14, "validation"]], "3. Alerting Rules": [[21, "alerting-rules"]], "4. Moving to Prometheus 2.x": [[21, "moving-to-prometheus-2-x"]], "a. Set the old system": [[21, "a-set-the-old-system"]], "b. Set the new system": [[21, "b-set-the-new-system"]], "Upgrade Scylla Monitoring Stack": [[20, "upgrade-scylla-monitoring-stack"]], "Troubleshoot Scylla Monitoring Stack": [[19, "troubleshoot-scylla-monitoring-stack"]], "Problem": [[19, "problem"]], "Scylla-Manager 2.2 with Duplicate information": [[19, "scylla-manager-2-2-with-duplicate-information"]], "A Container Fails To Start": [[19, "a-container-fails-to-start"]], "Files And Directory Permissions": [[19, "files-and-directory-permissions"]], "No Data Points": [[19, "no-data-points"]], "Solution": [[19, "solution"], [19, "id1"], [19, "id2"], [19, "id3"]], "Grafana Chart Shows Error (!) Sign": [[19, "grafana-chart-shows-error-sign"]], "Grafana Shows Server Level Metrics, but not Scylla Metrics": [[19, "grafana-shows-server-level-metrics-but-not-scylla-metrics"]], "Grafana Shows Scylla Metrics, but not Server Level Metrics": [[19, "grafana-shows-scylla-metrics-but-not-server-level-metrics"]], "Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1": [[19, "notice-to-users-upgrading-to-scylla-open-source-3-0-or-scylla-enterprise-2019-1"]], "Latencies Graphs Are empty": [[19, "latencies-graphs-are-empty"]], "Reducing the total number of metrics": [[19, "reducing-the-total-number-of-metrics"]], "Remove interrupts from node_exporter": [[19, "remove-interrupts-from-node-exporter"]], "Working with Wireshark": [[19, "working-with-wireshark"]], "Scylla Monitoring Stack Interfaces": [[17, "scylla-monitoring-stack-interfaces"]], "Prometheus API": [[17, "prometheus-api"]], "Scylla Monitoring Stack Reference Guide": [[15, "scylla-monitoring-stack-reference-guide"]], "Scylla Monitoring Stack Support Matrix": [[16, "scylla-monitoring-stack-support-matrix"]], "Troubleshooting Guide for Scylla Monitoring Stack": [[18, "troubleshooting-guide-for-scylla-monitoring-stack"]], "ScyllaDB Monitoring Stack Procedures": [[13, "scylladb-monitoring-stack-procedures"]], "Scylla Monitoring Stack Alert Manager": [[11, "scylla-monitoring-stack-alert-manager"]], "Scylla Monitoring Datadog Integration": [[12, "scylla-monitoring-datadog-integration"]], "Install And configure the Datadog Agent": [[12, "install-and-configure-the-datadog-agent"]], "Scylla Cloud Users": [[12, "scylla-cloud-users"]], "Other Scylla Users": [[12, "other-scylla-users"]], "Post configuration": [[12, "post-configuration"]], "Add datadog recording rules": [[12, "add-datadog-recording-rules"]], "Upload the Dashboard": [[12, "upload-the-dashboard"]], "Using the Dashboard": [[12, "using-the-dashboard"]], "Adding Monitor": [[12, "adding-monitor"]], "Alerting": [[10, "alerting"]], "Prometheus Alerts": [[10, "prometheus-alerts"]], "Alerts severity": [[10, "alerts-severity"]], "Adding Alerts": [[10, "adding-alerts"]], "Modifying Alerts": [[10, "modifying-alerts"]], "Alertmanager": [[10, "alertmanager"]], "Tips When Adding an Alert": [[10, "tips-when-adding-an-alert"]], "Adding and Modifying Dashboards": [[14, "adding-and-modifying-dashboards"]], "General Limitations": [[14, "general-limitations"]], "Consistency Between Restarts": [[14, "consistency-between-restarts"]], "Consistency Between Upgrades": [[14, "consistency-between-upgrades"]], "Using Templated Dashboards": [[14, "using-templated-dashboards"]], "The Template Class System": [[14, "the-template-class-system"]], "Panel Example": [[14, "panel-example"]], "Grafana Formats and Layouts": [[14, "grafana-formats-and-layouts"]], "Generating the dashboards from templates (generate-dashboards.sh)": [[14, "generating-the-dashboards-from-templates-generate-dashboards-sh"]], "Prerequisite": [[14, "prerequisite"], [2, "prerequisite"]], "System Overload": [[40, "system-overload"]], "Using Scylla Monitoring Stack": [[42, "using-scylla-monitoring-stack"]], "The CQL Optimization": [[41, "the-cql-optimization"]], "Prepared Statements": [[41, "prepared-statements"]], "Token Aware": [[41, "token-aware"]], "Paged Queries": [[41, "paged-queries"]], "Reversed CQL Reads": [[41, "reversed-cql-reads"]], "ALLOW FILTERING": [[41, "allow-filtering"]], "Consistency Level": [[41, "consistency-level"]], "Cross DC": [[41, "cross-dc"]], "Cross DC Consistency Level": [[41, "cross-dc-consistency-level"]], "Cross DC read requests": [[41, "cross-dc-read-requests"]], "The start-all.sh Command": [[7, "the-start-all-sh-command"]], "General Options": [[7, "general-options"]], "Grafana Related Commands": [[7, "grafana-related-commands"]], "Grafana LDAP support": [[7, "grafana-ldap-support"]], "Prometheus\u00a0Related Commands": [[7, "prometheus-related-commands"]], "Prometheus Retention Period": [[7, "prometheus-retention-period"]], "Alert Manager": [[7, "alert-manager"]], "Minimal Production System Recommendations": [[4, "minimal-production-system-recommendations"], [6, "minimal-production-system-recommendations"], [5, "minimal-production-system-recommendations"]], "Calculating Prometheus Minimal Disk Space requirement": [[4, "calculating-prometheus-minimal-disk-space-requirement"], [6, "calculating-prometheus-minimal-disk-space-requirement"], [5, "calculating-prometheus-minimal-disk-space-requirement"]], "Calculating Prometheus Minimal Memory Space requirement": [[4, "calculating-prometheus-minimal-memory-space-requirement"], [6, "calculating-prometheus-minimal-memory-space-requirement"], [5, "calculating-prometheus-minimal-memory-space-requirement"]], "Install Scylla Monitoring Stack": [[6, "install-scylla-monitoring-stack"], [6, "id1"], [5, "install-scylla-monitoring-stack"]], "Prerequisites": [[6, "prerequisites"]], "Scylla Monitoring Stack Compatibility Matrix": [[6, "id3"]], "Docker Post Installation": [[6, "docker-post-installation"]], "Configure Scylla Monitoring Stack": [[6, "configure-scylla-monitoring-stack"]], "Configure Scylla nodes from files": [[6, "configure-scylla-nodes-from-files"]], "Configure Scylla nodes using Scylla-Manager Consul API": [[6, "configure-scylla-nodes-using-scylla-manager-consul-api"]], "Connecting Scylla-Monitoring to ScyllaDB": [[6, "connecting-scylla-monitoring-to-scylladb"]], "Use an external directory for the Prometheus data directory": [[6, "use-an-external-directory-for-the-prometheus-data-directory"]], "Add Additional Prometheus Targets": [[6, "add-additional-prometheus-targets"]], "Start and Stop Scylla Monitoring Stack": [[6, "start-and-stop-scylla-monitoring-stack"]], "Start": [[6, "start"]], "Stop": [[6, "stop"]], "Start a Specific Scylla Monitoring Stack Version": [[6, "start-a-specific-scylla-monitoring-stack-version"]], "Accessing the localhost": [[6, "accessing-the-localhost"]], "Configure rsyslog on each Scylla node": [[6, "configure-rsyslog-on-each-scylla-node"]], "View Grafana Dashboards": [[6, "view-grafana-dashboards"]], "ScyllaDB Monitoring Stack": [[9, "scylladb-monitoring-stack"], [1, "scylladb-monitoring-stack"]], "High Level Architecture": [[9, "high-level-architecture"]], "Using Thanos as Data Source With Scylla Monitoring Stack": [[8, "using-thanos-as-data-source-with-scylla-monitoring-stack"]], "Using Thanos As a Prometheus Aggregator": [[8, "using-thanos-as-a-prometheus-aggregator"]], "Prometheus Configuration": [[8, "prometheus-configuration"]], "Thanos sidecar": [[8, "thanos-sidecar"]], "Thanos query": [[8, "thanos-query"]], "Update Scylla Data source": [[8, "update-scylla-data-source"]], "Deploying Scylla Monitoring Stack Without Docker": [[5, "deploying-scylla-monitoring-stack-without-docker"]], "Introduction": [[5, "introduction"]], "Install Alertmanager": [[5, "install-alertmanager"]], "Install Grafana Loki": [[5, "install-grafana-loki"]], "Install Prometheus": [[5, "install-prometheus"]], "Install Grafana": [[5, "install-grafana"]], "Using Scylla Plugin with Grafana": [[5, "using-scylla-plugin-with-grafana"]], "Setting a monitoring user": [[5, "setting-a-monitoring-user"]], "Installing the Plugin": [[5, "installing-the-plugin"]], "Configure the Plugin": [[5, "configure-the-plugin"]], "Enable the Plugin": [[5, "enable-the-plugin"]], "Using Docker Compose": [[2, "using-docker-compose"]], "Setting Prometheus": [[2, "setting-prometheus"]], "Setting Grafana Provisioning": [[2, "setting-grafana-provisioning"]], "Grafana Data-Source file": [[2, "grafana-data-source-file"]], "Grafana Dashboard Load file": [[2, "grafana-dashboard-load-file"]], "Docker Compose file": [[2, "docker-compose-file"]], "Start and Stop": [[2, "start-and-stop"]], "Download and Install Scylla Monitoring Stack": [[3, "download-and-install-scylla-monitoring-stack"]]}, "indexentries": {}}) \ No newline at end of file diff --git a/stable/sitemap.xml b/stable/sitemap.xml new file mode 100644 index 000000000..b234168cc --- /dev/null +++ b/stable/sitemap.xml @@ -0,0 +1,2 @@ + +https://monitoring.docs.scylladb.com/stable/common/monitor-description.htmlhttps://monitoring.docs.scylladb.com/stable/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/docker-compose.htmlhttps://monitoring.docs.scylladb.com/stable/install/index.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/datadog/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/min-prod-hw.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/index.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitor-without-docker.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/updating-dashboard.htmlhttps://monitoring.docs.scylladb.com/stable/reference/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/monitoring-stack.htmlhttps://monitoring.docs.scylladb.com/stable/reference/matrix.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.htmlhttps://monitoring.docs.scylladb.com/stable/install/start-all.htmlhttps://monitoring.docs.scylladb.com/stable/install/thanos.htmlhttps://monitoring.docs.scylladb.com/stable/reference/monitoring-apis.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/index.htmlhttps://monitoring.docs.scylladb.com/stable/intro.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/alerting.htmlhttps://monitoring.docs.scylladb.com/stable/troubleshooting/monitor-troubleshoot.htmlhttps://monitoring.docs.scylladb.com/stable/procedures/alerts/index.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/index.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlAllowFiltering.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAll.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeCLErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlCLAny.htmlhttps://monitoring.docs.scylladb.com/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNoTokenAware.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeIOErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPaged.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nodeLocalErrors.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/cqlNonPrepared.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/heavyCompaction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/nonBalancedcqlTraffic.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/preparedCacheEviction.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/advisor/systemOverload.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/cql-optimization.htmlhttps://monitoring.docs.scylladb.com/stable/use-monitoring/index.htmlhttps://monitoring.docs.scylladb.com/stable/genindex.htmlhttps://monitoring.docs.scylladb.com/stable/404.htmlhttps://monitoring.docs.scylladb.com/stable/search.html \ No newline at end of file diff --git a/stable/troubleshooting/index.html b/stable/troubleshooting/index.html new file mode 100644 index 000000000..4ba4314a2 --- /dev/null +++ b/stable/troubleshooting/index.html @@ -0,0 +1,657 @@ + + + + + + + + + + + + + Troubleshooting Guide for Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Troubleshooting Guide for Scylla Monitoring Stack

                                    +
                                    +
                                    +

                                    Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/troubleshooting/monitor-troubleshoot.html b/stable/troubleshooting/monitor-troubleshoot.html new file mode 100644 index 000000000..b8878c653 --- /dev/null +++ b/stable/troubleshooting/monitor-troubleshoot.html @@ -0,0 +1,876 @@ + + + + + + + + + + + + + Troubleshoot Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Troubleshoot Scylla Monitoring Stack

                                    +

                                    This document describes steps that need to be done to troubleshoot monitoring problems when using Grafana/Prometheus monitoring tool.

                                    +
                                    +

                                    Problem

                                    +
                                    +

                                    Scylla-Manager 2.2 with Duplicate information

                                    +

                                    Scylla Manager 2.2 change the default metrics (Prometheus) reporting ports:

                                    +
                                      +
                                    • For Manager server: from 56090 to 5090

                                    • +
                                    • For Manager Agent: from 56090 to 5090

                                    • +
                                    +

                                    For backward compatibility, Scylla Monitoring Stack 3.5 default configuration reads from both Manager ports, old and new, so you do not have to update the Prometheus configuration when upgrading to Manager 2.2

                                    +

                                    However, if you configure scylla_manager_server.yml file with the new port, Scylla-Manager dashboard will report all metrics twice.

                                    +

                                    The easiest way around this is to edit prometheus/prometheus.yml.template and remove the scylla_manager1 job.

                                    +

                                    Note that for this change to take effect you need to run kill-all.sh followed by start-all.sh.

                                    +
                                    +
                                    +

                                    A Container Fails To Start

                                    +

                                    When running ./start-all.sh a container can fail to start. For example you can see the following error message:

                                    +
                                    Wait for Prometheus container to start........Error: Prometheus container failed to start
                                    +
                                    +
                                    +

                                    Should this happen, check the Docker logs for more information.

                                    +
                                    docker logs aprom
                                    +
                                    +
                                    +

                                    Usually the reason for the failure is described in the logs.

                                    +
                                    +
                                    +

                                    Files And Directory Permissions

                                    +
                                    +

                                    Note

                                    +

                                    Avoid running Docker containers as root.

                                    +
                                    +

                                    The preferred way of running the container is using a non root user. +See the monitoring Docker post-installation section.

                                    +

                                    If a container failed to start because of a permission problem, make sure +the external directory you are using is owned by the current user and that the current user has the proper permissions.

                                    +
                                    +

                                    Note

                                    +

                                    If you started the container in the past as root, you may need to change the directory and files ownership and permissions.

                                    +
                                    +

                                    For example if your Prometheus data directory is /prom-data and you are using centos user

                                    +
                                    ls -la /|grep prom-data
                                    +
                                    +drwxr-xr-x    2 root root  4096 Jun 25 17:51 prom-data
                                    +
                                    +sudo chown -R centos:centos /prom-data
                                    +
                                    +ls -la /|grep prom-data
                                    +
                                    +drwxr-xr-x    2 centos centos  4096 Jun 25 17:51 prom-data
                                    +
                                    +
                                    +
                                    +
                                    +

                                    No Data Points

                                    +

                                    No data points on all data charts.

                                    +
                                    +

                                    Solution

                                    +

                                    If there are no data points, or if a node appears to be unreachable when you know it is up, the immediate suspect is the Prometheus connectivity.

                                    +
                                      +
                                    1. Login to the Prometheus console:

                                    2. +
                                    3. Point your browser to http://{ip}:9090, where {ip} is the Prometheus IP address.

                                    4. +
                                    5. Go to the target tabs: http://{ip}:9090/targets and see if any of the targets are down and if there are any error messages.

                                    6. +
                                    +
                                    +
                                      +
                                    • Make sure you are not using the local network for local IP range When using Docker containers, by default, the local IP range (127.0.0.X) is inside the Docker container and not the host local address. If you are trying to connect to a target via the local IP range from inside a Docker container, you need to use the -l flag to enable local network stack.

                                    • +
                                    • Confirm Prometheus is pointing to the wrong target. Check your prometheus/scylla_servers.yml. Make sure Prometheus is pulling data from the Scylla server.

                                    • +
                                    • Your dashboard and Scylla version may not be aligned. If you are running Scylla 3.1.x, you can specify a specific version with -v flag.

                                    • +
                                    +
                                    +

                                    For example:

                                    +
                                    ./start-all.sh -v 3.1
                                    +
                                    +
                                    +

                                    More on start-all.sh options.

                                    +
                                    +
                                    +
                                    +

                                    Grafana Chart Shows Error (!) Sign

                                    +

                                    Run this procedure on the Scylla Monitoring Stack server.

                                    +

                                    If the Grafana charts show an error (!) sign, there is a problem with the connection between Grafana and Prometheus.

                                    +
                                    +

                                    Solution

                                    +

                                    On the Scylla Monitoring Stack server:

                                    +
                                      +
                                    1. Check Prometheus is running using docker ps.

                                    2. +
                                    +
                                      +
                                    • If it is not running check the prometheus.yml for errors.

                                    • +
                                    +

                                    For example:

                                    +
                                    CONTAINER ID  IMAGE    COMMAND                  CREATED         STATUS         PORTS                                                    NAMES
                                    +41bd3db26240  monitor  "/docker-entrypoin..."   25 seconds ago  Up 23 seconds  7000-7001/tcp, 9042/tcp, 9160/tcp, 9180/tcp, 10000/tcp   monitor
                                    +
                                    +
                                    +
                                      +
                                    • If it is running, go to “Data Source” in the Grafana GUI, choose Prometheus and click Test Connection.

                                    • +
                                    +
                                    +
                                    +
                                    +

                                    Grafana Shows Server Level Metrics, but not Scylla Metrics

                                    +

                                    Grafana shows server level metrics like disk usage, but not Scylla metrics. +Prometheus fails to fetch metrics from Scylla servers.

                                    +
                                    +

                                    Solution

                                    +
                                      +
                                    • Use curl <scylla_node>:9180/metrics to fetch binary metric data from Scylla. If curl does not return data, the problem is the connectivity between the Scylla Monitoring Stack and Scylla server. In that case, check your IPs and firewalls.

                                    • +
                                    +

                                    For example

                                    +
                                    curl 172.17.0.2:9180/metrics
                                    +
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Grafana Shows Scylla Metrics, but not Server Level Metrics

                                    +

                                    Grafana dashboards show Scylla metrics, such as load, but not server metrics such as disk usage. +Prometheus fails to fetch metrics from node_exporter.

                                    +
                                    +

                                    Solution

                                    +

                                    1. Make sure that node_exporter is running on each Scylla server (by login to the machine and running ps -ef |gre node_exporter). node_exporter is installed with scylla_setup. +to check that node_exporter is installed, run node_exporter --version, If it is not, make sure to install and run it.

                                    +
                                      +
                                    1. If it is running, use curl http://<scylla_node>:9100/metrics (where <scylla_node> is a Scylla server IP) to fetch metric data from Scylla. If curl does not return data, the problem is the connectivity between Scylla Monitoring Stack and Scylla server. Please check your IPs and firewalls.

                                    2. +
                                    +
                                    +
                                    +

                                    Notice to users upgrading to Scylla Open Source 3.0 or Scylla Enterprise 2019.1

                                    +

                                    While upgrading, you need to upgrade the node_exporter from version 0.14 to 0.17.

                                    +

                                    If the node_exporter service is not starting it may need to be updated manually.

                                    +

                                    Check the node_exporter version node_exporter --version if it shows 0.14 check the node_exporter section +in the upgrade guide.

                                    +
                                    +
                                    +
                                    +

                                    Latencies Graphs Are empty

                                    +

                                    Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’ recording rules for performance reasons. Recording rules perform some of the calculations when collecting the metrics, instead of when showing the dashboards.

                                    +

                                    During a transition period, Scylla Monitoring version 3.x has a fallback mechanism that shows data even if the recording rules are not present.

                                    +

                                    Scylla Monitoring versions 4.0 and newer rely only on recording rules.

                                    +

                                    If only the latency graphs are missing, it is because of missing recording rules.

                                    +

                                    This issue can be avoided in a clean installation, so if you are upgrading, it is recommended to perform a clean installation.

                                    +

                                    If you are using a standalone Prometheus server, make sure to copy the Prometheus configuration and recording rules as describe in install without docker.

                                    +
                                    +
                                    +

                                    Reducing the total number of metrics

                                    +

                                    In ScyllaDB, metrics are reported per shard (core) per node. A cluster with a high number of nodes and cores reports an increased number of metrics which might overload the Monitoring system like Prometheus or Datadog. +Below is one way to reduce the number of metrics reported per ScyllaDB Node.

                                    +
                                    +

                                    Remove interrupts from node_exporter

                                    +

                                    By default, node_exporter reports interrupt metrics. You can disable interrupts reporting by editing +/etc/sysconfig/scylla-node-exporter and remove –collector.interrupts from it.

                                    +
                                    +
                                    +
                                    +

                                    Working with Wireshark

                                    +

                                    No metrics shown in the Scylla Monitoring Stack.

                                    +
                                      +
                                    1. Install wireshark

                                    2. +
                                    +

                                    2. Capture the traffic between the Scylla Monitoring Stack and Scylla node using the tshark command. +tshark -i <network interface name> -f "dst port 9180"

                                    +

                                    For example:

                                    +
                                    tshark -i eth0 -f "dst port 9180"
                                    +
                                    +
                                    +

                                    Capture from Scylla node towards Scylla Monitoring Stack server.

                                    +

                                    In this example, Scylla is running.

                                    +
                                    Monitor ip        Scylla node ip
                                    +199.203.229.89 -> 172.16.12.142 TCP 66 59212 > 9180 [ACK] Seq=317 Ack=78193 Win=158080 Len=0 TSval=79869679 TSecr=3347447210
                                    +
                                    +
                                    +

                                    In this example, Scylla is not running

                                    +
                                    Monitor ip        Scylla node ip
                                    +199.203.229.89 -> 172.16.12.142 TCP 74 60440 > 9180 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=79988291 TSecr=0 WS=128
                                    +
                                    +
                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/troubleshooting/monitor_troubleshoot.html b/stable/troubleshooting/monitor_troubleshoot.html new file mode 100644 index 000000000..193a16915 --- /dev/null +++ b/stable/troubleshooting/monitor_troubleshoot.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/index.html b/stable/upgrade/index.html new file mode 100644 index 000000000..f457ef198 --- /dev/null +++ b/stable/upgrade/index.html @@ -0,0 +1,673 @@ + + + + + + + + + + + + + Upgrade Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Scylla Monitoring Stack

                                    +
                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html b/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html new file mode 100644 index 000000000..c7a759c2d --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-1.x-to-monitoring-2.x.html @@ -0,0 +1,784 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 1.x to Scylla Monitoring 2.x

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 1.x to 2.x

                                    +

                                    Scylla monitoring stack uses Prometheus as its metrics database. The main differences between Scylla Monitoring 1.x and 2.x are moving from Prometheus version 1.x to Prometheus 2.x. +Since Prometheus is not backward compatible between these two versions, the upgrade procedure consists of running the two monitoring stack, old and new, in parallel, allowing the new stack to read metrics from the old one. This procedure will enable you to migrate your Scylla monitoring stack without losing historical metric data in the process. +Once the Prometheus retention time has passed, you can safely remove the old stack.

                                    +
                                    +

                                    Upgrade Procedure

                                    +
                                    +

                                    1. Upgrade to the latest 1.x version

                                    +

                                    Before starting the upgrade procedure, make sure you are running the latest 1.x version

                                    +
                                    +
                                    +

                                    2. Install the new monitoring stack

                                    +
                                      +
                                    1. Download the 2.x version from the release page.

                                    2. +
                                    3. Unzip it into a different directory. This is important, as Prometheus is not backward compatible and would not be able to use the old data.

                                    4. +
                                    5. You can use the server definitions from the old monitoring stack by copying the target files from the old stack to the new one, located on the prometheus/ directory:

                                      +
                                        +
                                      • scylla_servers.yml

                                      • +
                                      • scylla_manager_servers.yml

                                      • +
                                      • node_exporter_servers.yml

                                      • +
                                      +
                                    6. +
                                    7. Start the new monitoring stack. If you are using Docker, make sure you are using -g -p and -m to specify different ports than the old monitoring stack. For example:

                                    8. +
                                    +
                                    ./start-all.sh -g 3001 -p 9091 -m 9094 -d /new-prometheus-data-path
                                    +
                                    +
                                    +
                                    +

                                    Note

                                    +

                                    Make sure to use the -d option, letting Prometheus keep its data outside the Docker container. Fail to do so will result in loss of historical data in case you restart the monitoring stack.

                                    +
                                    +

                                    While the old monitoring stack keeps working, you can take the new stack up and down to make sure everything works correctly. Note that if you are using non-default ports setting, you should use the same for stopping the stack:

                                    +
                                    ./kill-all.sh -g 3001 -p 9091 -m 9094
                                    +
                                    +
                                    +
                                    +

                                    Validation

                                    +

                                    Make sure the new monitoring stack is working before moving to 2.x as your main system. See that the graphs return data, and nodes are reachable.

                                    +
                                    +
                                    +
                                    +

                                    3. Alerting Rules

                                    +

                                    Note that alerting rules moved to a yml file format. Make sure that all defined rules are taken.

                                    +
                                    +
                                    +

                                    4. Moving to Prometheus 2.x

                                    +

                                    Monitoring stack Version 2.0 upgrade the Prometheus version from 1.8 to 2.3. This upgrade is not backward compatible. +Prometheus Migration is cover here. +Note that when using the docker containers, besides the data migration, the docker permissions were changed. This means that the permissions of the data directory will no longer work.

                                    +

                                    Do the following to allow the Prometheus in the new monitoring stack to read historical metrics from the old Prometheus:

                                    +
                                    +

                                    a. Set the old system

                                    +

                                    The following steps will stop the old monitoring stack from reading new metrics while exposing an API for the new monitoring stack to read historical metrics from.

                                    +
                                      +
                                    • In the old Prometheus prometheus.yml.template file, remove the alerting, scrape_configs, and rule_files sections, keeping only the external_labels section.

                                    • +
                                    • Restart the old monitoring stack with, kill-all.sh followed by start-all.sh with command line flag -b "-web.listen-address=:9111".

                                    • +
                                    +
                                    +

                                    Note

                                    +

                                    After this phase, the old monitoring stack will not be updated with new metrics. It will only serve as a data source of historical data for the new stack

                                    +
                                    +
                                    +
                                    +

                                    b. Set the new system

                                    +

                                    The following step will allow the new monitoring system to read historical metrics from the old system.

                                    +
                                      +
                                    • In the Prometheus prometheus.yml.template file add the following at the end:

                                    • +
                                    +
                                    remote_read:
                                    +  - url: "http://{ip}:9111/api/v1/read"
                                    +
                                    +
                                    +

                                    Where {ip} is the ip of the old system.

                                    +
                                      +
                                    • restart the new stack

                                    • +
                                    +
                                    +
                                    +
                                    +

                                    Validate the upgrade

                                    +

                                    You should be able to see the graphs on the new stack. Make sure you see the graphs’ history. +By default, the Prometheus retention period is 15 days, so after that period, it is safe to take down the old system and remove the remote_read from the new Prometheus configuration.

                                    +
                                    +
                                    +
                                    +

                                    Rollback

                                    +

                                    In the upgrade procedure, you set up a second monitoring stack. The old monitoring stack continues to work in parallel. To rollback, add back the Prometheus targets in the old system, and take down the new system.

                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html b/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html new file mode 100644 index 000000000..7312ffd2b --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-2.y.html @@ -0,0 +1,778 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 2.y

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 2.y, for example, between 2.0 to 2.1.

                                    +
                                    +

                                    Upgrade Procedure

                                    +

                                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                    +

                                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                    +
                                    +

                                    Install 2.y (The new version)

                                    +
                                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-2.y.zip
                                    +unzip scylla-monitoring-2.y.zip
                                    +cd scylla-monitoring-scylla-monitoring-2.y/
                                    +
                                    +
                                    +

                                    Replace “y” with the new minor release number, for example, 2.1.zip

                                    +
                                    +
                                    +

                                    Setting the server’s files

                                    +

                                    Copy the scylla_servers.yml and node_exporter_servers.yml from the version that is already installed.

                                    +
                                    cp /path/to/monitoring/2.x/prometheus/scylla_servers.yml prometheus/
                                    +cp /path/to/monitoring/2.x/prometheus/node_exporter_servers.yml prometheus/
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validate the new version is running the correct version

                                    +

                                    Starting from Scylla-Monitoring version 2.2, you can run:

                                    +
                                    ./start-all.sh --version
                                    +
                                    +
                                    +

                                    To validate the Scylla-Monitoring version.

                                    +
                                    +
                                    +

                                    Validate the version installed correctly

                                    +

                                    To validate that the Monitoring stack starts correctly, first in parallel to the current (2.x) stack.

                                    +
                                    ./start-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                                    +

                                    Note that we are using different ports numbers for Grafana, Prometheus, and the Alertmanager.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: do not use the local dir flag when testing!

                                    +
                                    +

                                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: Do not kill the 2.x version that is currently running.

                                    +
                                    +

                                    Use the following command to kill the containers:

                                    +
                                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    You can start and stop the new 2.y version while testing.

                                    +
                                    +
                                    +

                                    Move to version 2.y (the new version)

                                    +

                                    Note: migrating will cause a few seconds of blackout in the system.

                                    +

                                    We assume that you are using external volume to store the metrics data.

                                    +
                                    +

                                    Kill all containers

                                    +

                                    Follow the instruction on how to kill the 2.y version when in testing mode.

                                    +

                                    To kill the 2.x version containers, run:

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +

                                    Start version 2.y in normal mode

                                    +

                                    From the new root of the scylla-monitoring-scylla-monitoring-2.y run

                                    +
                                    ./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +

                                    Point your browser to http://{ip}:3000 and see that the data is there.

                                    +
                                    +
                                    +
                                    +

                                    Rollback to version 2.x

                                    +

                                    To rollback during the testing mode, kill the 2.y containers as explained above, and the system will continue to operate normally.

                                    +

                                    To rollback to version 2.x after you completed the moving to version 2.y (as shown above). +Run:

                                    +
                                    ./kill-all.sh
                                    +cd /path/to/scylla-grafana-2.x/
                                    +./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +
                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html b/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html new file mode 100644 index 000000000..519ac7065 --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-2.x-to-monitoring-3.y.html @@ -0,0 +1,742 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 2.x to Scylla Monitoring 3.x

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 2.x to 3.x

                                    +

                                    Switching from Scylla Monitoring 2.x to Scylla Monitoring 3.x is not fully backward compatible. +The changes affect dashboards’ names and metrics.

                                    +
                                    +

                                    Upgrade Procedure

                                    +
                                    +

                                    1. Validate node_exporter version

                                    +

                                    Scylla Monitoring uses the node_exporter utility to collect OS-related metrics. By default, Scylla will install node_exporter version 0.17. +If you upgrade in the past from the older Scylla version (before Scylla 2.3), you should verify that you are running the correct node_exporter. +You can do that by running node_exporter –version on the machines running Scylla.

                                    +

                                    If you are running an older version of node_exporter you can use the helper script node_exporter_install –force that shipped with Scylla to force upgrade.

                                    +
                                    +
                                    +

                                    2. Install the new monitoring stack

                                    +
                                      +
                                    1. Download the 3.x version from the release page.

                                    2. +
                                    3. Unzip it into a different directory.

                                    4. +
                                    5. Copy the targets files from the old stack to the new one, located on the prometheus/ sub-directory:

                                      +
                                        +
                                      • scylla_servers.yml (for example cp /path/to/old/monitor/prometheus/scylla_servers.yml prometheus/)

                                      • +
                                      • scylla_manager_servers.yml

                                      • +
                                      +
                                      +
                                      +

                                      Note

                                      +

                                      The targets files are no longer part of the release, make sure to copy them or the monitoring stack will not start.

                                      +
                                      +
                                      +
                                    6. +
                                    7. Stop the old monitoring stack

                                      +
                                      +
                                      ./kill-all.sh
                                      +
                                      +
                                      +
                                      +
                                    8. +
                                    9. Start the new monitoring stack

                                      +
                                      +
                                      ./start-all.sh -d /prometheus-data-path
                                      +
                                      +
                                      +
                                      +
                                    10. +
                                    +
                                    +
                                    +

                                    Validate the upgrade

                                    +

                                    You should be able to see the graphs on the new stack. Make sure you see the graphs’ history.

                                    +

                                    Because of the metrics, name change graphs will display correctly but with a different color as of the time of the upgrade. +This is only true for the transition phase.

                                    +
                                    +
                                    +
                                    +

                                    Rollback

                                    +

                                    To rollback, simply kill the new stack, change to the old monitoring stack directory, and start it.

                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html b/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html new file mode 100644 index 000000000..02ee3e91b --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-3.y.html @@ -0,0 +1,786 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 3.y

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 3.y, for example, between 3.0 to 3.0.1.

                                    +
                                    +

                                    Upgrade Procedure

                                    +

                                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                    +

                                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                    +
                                    +

                                    Install 3.y (The new version)

                                    +
                                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.y.zip
                                    +unzip scylla-monitoring-3.y.zip
                                    +cd scylla-monitoring-scylla-monitoring-3.y/
                                    +
                                    +
                                    +

                                    Replace “y” with the new minor release number, for example, 3.0.1.zip

                                    +
                                    +
                                    +

                                    Setting the server’s files

                                    +

                                    Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                    +
                                    cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                    +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validate the new version is running the correct version

                                    +

                                    Starting from Scylla-Monitoring version 2.2, you can run:

                                    +
                                    ./start-all.sh --version
                                    +
                                    +
                                    +

                                    To validate the Scylla-Monitoring version.

                                    +
                                    +
                                    +

                                    Validate the version installed correctly

                                    +

                                    To validate that the Monitoring stack starts correctly, first in parallel to the current (3.x) stack.

                                    +
                                    ./start-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                                    +

                                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: do not use the local dir flag when testing!

                                    +
                                    +

                                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: Do not kill the 3.x version that is currently running.

                                    +
                                    +
                                    +
                                    +

                                    Killing the new 3.y Monitoring stack in testing mode

                                    +

                                    Use the following command to kill the containers:

                                    +
                                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    You can start and stop the new 3.y version while testing.

                                    +
                                    +
                                    +

                                    Move to version 3.y (the new version)

                                    +

                                    Note: migrating will cause a few seconds of blackout in the system.

                                    +

                                    We assume that you are using external volume to store the metrics data.

                                    +
                                    +

                                    Kill all containers

                                    +

                                    At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                    +

                                    Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 3.y Monitoring stack in testing mode +in the previous section

                                    +

                                    kill the older 3.x version containers by running:

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +

                                    Start version 3.y in normal mode

                                    +

                                    From the new root of the scylla-monitoring-scylla-monitoring-3.y run

                                    +
                                    ./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +

                                    Point your browser to http://{ip}:3000 and see that the data is there.

                                    +
                                    +
                                    +
                                    +

                                    Rollback to version 3.x

                                    +

                                    To rollback during the testing mode, follow Killing the new 3.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                    +

                                    To rollback to version 3.x after you completed the moving to version 3.y (as shown above). +Run:

                                    +
                                    ./kill-all.sh
                                    +cd /path/to/scylla-grafana-3.x/
                                    +./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +
                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html b/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html new file mode 100644 index 000000000..320527dc8 --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-3.x-to-monitoring-4.y.html @@ -0,0 +1,929 @@ + + + + + + + + + + + + + Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - Scylla Monitoring 3.x to Scylla Monitoring 4.y

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 3.x to 4.y, for example, between 3.9 to 4.0.0.

                                    +
                                    +

                                    Upgrade Procedure

                                    +

                                    We recommend installing the new release next to the old one. You can run both monitoring stacks in parallel, ensuring it is working as expected before uninstalling the old version.

                                    +

                                    Change to the directory you want to install the new Monitoring stack. +Download the latest release in the .zip or .tar format.

                                    +
                                    +

                                    Install 4.y (The new version)

                                    +
                                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.zip
                                    +unzip scylla-monitoring-4.y.zip
                                    +cd scylla-monitoring-scylla-monitoring-4.y/
                                    +
                                    +
                                    +

                                    Replace “y” with the new minor and patch release number, for example, 4.0.0.zip

                                    +
                                    +
                                    +

                                    Setting the server’s files

                                    +

                                    Copy the scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                    +
                                    cp /path/to/monitoring/3.x/prometheus/scylla_servers.yml prometheus/
                                    +cp /path/to/monitoring/3.x/prometheus/scylla_manager_servers.yml.yml prometheus/
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validate the new version is running the correct version

                                    +

                                    run:

                                    +
                                    ./start-all.sh --version
                                    +
                                    +
                                    +

                                    To validate the Scylla-Monitoring version.

                                    +
                                    +
                                    +
                                    +

                                    Running in test mode

                                    +

                                    This section is optional. It shows you how to run two monitoring stacks side by side. You can skip this section entirely and move to +switching to the new version section.

                                    +
                                    +

                                    Running second monitoring stack

                                    +

                                    We need to use different ports to run two monitoring stacks in parallel (i.e., the older 3.x version and the new 4.x stack).

                                    +
                                    ./start-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    Browse to http://{ip}:9091 and check the Grafana dashboard.

                                    +

                                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: do not use the local dir flag when testing!

                                    +
                                    +

                                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: Do not kill the 3.x version that is currently running!

                                    +
                                    +
                                    +
                                    +

                                    Killing the new 4.y Monitoring stack in testing mode

                                    +

                                    Use the following command to kill the containers:

                                    +
                                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    You can start and stop the new 4.y version while testing.

                                    +
                                    +
                                    +
                                    +

                                    Migrating

                                    +
                                    +

                                    Move to version 4.y (the new version)

                                    +

                                    Note: migrating will cause a few seconds of blackout in the system.

                                    +

                                    We assume that you are using external volume to store the metrics data.

                                    +
                                    +

                                    Backup

                                    +

                                    We suggest to copy the Prometheus external directory first and use the copy as the data directory for the new monitoring stack. +Newer Monitoring stack uses newer Promethues versions, and keeping a backup of the prometheus dir would allow you to rollback.

                                    +
                                    +
                                    +

                                    Kill all containers

                                    +

                                    At this point you have two monitoring stacks installed with the older version running.

                                    +

                                    If you run the new version in testing mode kill it by following the instructions on how to Killing the new 4.y Monitoring stack in testing mode +in the previous section.

                                    +

                                    kill the older 3.x version containers by running:

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +

                                    Start version 4.y in normal mode

                                    +

                                    From the new root of the scylla-monitoring-scylla-monitoring-4.y run

                                    +
                                    ./start-all.sh -d /path/to/copy/data/dir
                                    +
                                    +
                                    +

                                    Point your browser to http://{ip}:3000 and see that the data is there.

                                    +
                                    +
                                    +
                                    +

                                    Rollback to version 3.x

                                    +

                                    To rollback during the testing mode, follow Killing the new 4.y Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                    +

                                    To rollback to version 3.x after you completed moving to version 4.y (as shown above), run:

                                    +
                                    ./kill-all.sh
                                    +cd /path/to/scylla-grafana-3.x/
                                    +./start-all.sh -d /path/to/original/data/dir
                                    +
                                    +
                                    +
                                    +
                                    +
                                    +

                                    Post-installation: Metrics back-filling

                                    +

                                    Starting from Scylla Monitoring version 3.8, Scylla Monitoring uses Prometheus’s recording rules for performance reasons. +Recording rules perform some of the calculations when collecting the metrics instead of when showing the dashboards.

                                    +

                                    For example, this is a recording rule that calculates the p99 write latency:

                                    +
                                    - record: wlatencyp99
                                    +  expr: histogram_quantile(0.99, sum(rate(scylla_storage_proxy_coordinator_write_latency_bucket{}[60s])) by (cluster, dc, instance, shard, scheduling_group_name, le))
                                    +  labels:
                                    +    by: "instance,shard"
                                    +
                                    +
                                    +

                                    For a transition period, Scylla Monitoring version 3.x has a fall-back mechanism that if those recording rules +are not present data will still be shown.

                                    +

                                    Scylla Monitoring versions 4.0 and newer will rely only on recording rules.

                                    +
                                    +
                                    +

                                    Note

                                    +

                                    If you upgrade from a version older than 3.8 without back-filling, latency historical data will not be shown.

                                    +
                                    +
                                    +
                                    +../_images/before-backfilling.png +
                                    +

                                    This is an example of missing latency graph

                                    +
                                    +
                                    +

                                    The following instructions are only relevant if you are upgrading from a version older than 3.8 to version 4.0 or higher, +or if you are looking at historical data collected before you upgraded to 3.8.

                                    +

                                    For example, you keep your data (retention period) for a year, and you upgraded to version 3.8 three months ago.

                                    +

                                    In this example you have recording rules data only for the last three months, to be able to look at older latency +information you will need to back-fill that missing period.

                                    +

                                    The following instructions are based on the recording rules backfilling section in the Prometheus documentation.

                                    +
                                    +

                                    Determine the backfilling period

                                    +

                                    When you run the backfilling process you need to determine the start time and end time.

                                    +
                                    +

                                    Determine the start time

                                    +

                                    The start time is your Prometheus retention time, by default it is set to 15 days. if you are not sure what Prometheus retention time is, you can check by +logging in to your Prometheus server: http://{ip}:9090/status.

                                    +

                                    If you are running Scylla Monitoring version 3.8 or newer for longer than the retention period, you are done! You can skip the rest of this section.

                                    +

                                    For the rest of this example, we will assume that your retention time is 360 days.

                                    +
                                    +
                                    +

                                    Determine the end time

                                    +

                                    Typically, you need to back-fill the recording rules when you are using a long retention period, for example, you have a year of retention data, +and you upgraded to Scylla Monitoring 3.8 about three months ago.

                                    +

                                    If you open the Overview dashboard and look at your entire retention time (in our example 1 year) you will see that while most of the graphs do +show the data, the latency graphs have a missing period, in our example - from the entire year, the latency graph will only show the last three months.

                                    +

                                    That nine months gap (12 months minus 3) is what we want to fill with back-filling.

                                    +

                                    The point in time that the graphs start will be your back-filling end time. Check in the graph for the exact time.

                                    +
                                    +
                                    +
                                    +

                                    Backfilling Process

                                    +
                                    +

                                    backup

                                    +

                                    If you have a long retention period you are using an external directory that holds the Prometheus data, back it up, in case +If you have a long retention period, you are using an external directory that holds the Prometheus data back it up; if something goes wrong in the process, you can revert the process.

                                    +

                                    To complete the process you will need to restart the monitoring stack at least once. If you are not using an external directory (The -d +command-line option) You cannot complete it.

                                    +
                                    +
                                    +

                                    Restart the monitoring stack

                                    +

                                    You need to stop the monitoring stack and run the stat-all.sh command with an additional flag:

                                    +

                                    -b "--storage.tsdb.allow-overlapping-blocks"

                                    +
                                    +
                                    +

                                    Create the data files

                                    +

                                    We will use the Promtool utility; it’s already installed for you if you are using the docker container. +You will need the start time and end time for the process, in our example the start time is 360 days ago and the end time is 90 days ago.

                                    +

                                    The start and end times are in epoc, so you will need to translate the times to epoc. There are many ways to do this - for example, from the command line. +Run the following command to get the epoc time for 90 days ago: : echo $((`date +%s` - 3600*24*90))

                                    +

                                    Log in to your docker container and run the following (start and end should be the start and end in epoc time):

                                    +
                                    docker exec -it aprom sh
                                    +cd /prometheus/data/
                                    +promtool tsdb create-blocks-from rules \
                                    +--start $start \
                                    +--end $end \
                                    +--url http://localhost:9090 \
                                    +/etc/prometheus/prom_rules/back_fill/3.8/rules.1.yml
                                    +
                                    +
                                    +

                                    It will create a data directory in the directory where you run it. +The reason to run it under the /prometheus/data/ is you can be sure Prometheus has write privileges there.

                                    +
                                    +
                                    +

                                    Note

                                    +

                                    Depending on the time range and the number of cores, the process can take a long time. During testing it took an hour for every week of data, +for a cluster with a total of 100 cores. Make sure that the creation process is not inerupt. You can split the time range to smaller durations +(e.g. instead of an entire year, do it a weeks at a time).

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Copy the data files

                                    +

                                    Make sure that the process is completed successfully - don’t start this section before you complete the previous sections.

                                    +

                                    Copy the data files to the Prometheus directory:

                                    +
                                    cp data/* .
                                    +
                                    +
                                    +

                                    The rules will be evaluated next time Prometheus will perform compaction. You can force it by restarting the server using docker restart aprom

                                    +

                                    Follow the logs docker logs aprom to see that the process works as expected. If there are no errors, you should now be able to +see the latency graphs over your entire retention time.

                                    +
                                    +../_images/after-backfilling.jpg +
                                    +

                                    Un example: after loading half of the data

                                    +
                                    +
                                    +
                                    +
                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html b/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html new file mode 100644 index 000000000..c9af132c6 --- /dev/null +++ b/stable/upgrade/upgrade-guide-from-monitoring-4.x-to-monitoring-4.y.html @@ -0,0 +1,801 @@ + + + + + + + + + + + + + Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Upgrade Guide - ScyllaDB Monitoring 4.x.a to ScyllaDB Monitoring 4.y.b

                                    +

                                    This document is a step by step procedure for upgrading ScyllaDB Monitoring Stack from version 4.x.a to 4.y.b, for example, between 4.0.0 to 4.0.1.

                                    +
                                    +

                                    Upgrade Procedure

                                    +

                                    We recommend installing the new release next to the old one, running both in parallel, and making sure it is working as expected before uninstalling the old version.

                                    +

                                    Change to the directory you want to install the new Monitoring stack. +Download the latest release: +You can download the .zip or the .tar.

                                    +
                                    +

                                    Install 4.y.b (The new version)

                                    +
                                    wget -L https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-4.y.b.zip
                                    +unzip scylla-monitoring-4.y.b.zip
                                    +cd scylla-monitoring-scylla-monitoring-4.y.b/
                                    +
                                    +
                                    +

                                    Replace “y” with the new minor release number, for example, 4.0.1.zip

                                    +
                                    +
                                    +

                                    Setting the server’s files

                                    +

                                    Copy the target files scylla_servers.yml and scylla_manager_servers.yml from the version that is already installed.

                                    +
                                    cp /path/to/monitoring/4.x.a/prometheus/scylla_servers.yml prometheus/
                                    +cp /path/to/monitoring/4.x.a/prometheus/scylla_manager_servers.yml.yml prometheus/
                                    +
                                    +
                                    +
                                    +

                                    Validate the port numbers

                                    +

                                    ScyllaDB-monitoring reads from ScyllaDB itself, from node_exporter for OS-related metrics, and from the ScyllaDB Manager agent.

                                    +

                                    Almost always, those targets use their default ports, and all share the same IP. +If you use the default port number, we recommend using the target file without ports and letting ScyllaDB monitoring add the default port number. +If the ScyllaDB Manager agent and node_exporter are running next to ScyllaDB on the same host (the default installation), use one target file for scylla_server, and the ScyllaDB monitoring will use that file with the correct ports for each target.

                                    +
                                    +

                                    Caution

                                    +

                                    As of SyllaDB Monitoring 4.5, Specifying the node_exporter file (the -n flag) with the wrong ports will prevent ScyllaDB Monitoring from reading the metrics.

                                    +
                                    +
                                    +
                                    +
                                    +

                                    Validate the new version is running the correct version

                                    +

                                    Run:

                                    +
                                    ./start-all.sh --version
                                    +
                                    +
                                    +

                                    To validate the Scylla-Monitoring version.

                                    +
                                    +
                                    +

                                    Validate the version installed correctly

                                    +

                                    To validate that the Monitoring stack starts correctly, first in parallel to the current (4.x.a) stack.

                                    +
                                    ./start-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    Browse to http://{ip}:9091 +And check the Grafana dashboard

                                    +

                                    Note that we are using different port numbers for Grafana, Prometheus, and the Alertmanager.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: do not use the local dir flag when testing!

                                    +
                                    +

                                    When you are satisfied with the data in the dashboard, you can shut down the containers.

                                    +
                                    +

                                    Caution

                                    +

                                    Important: Do not kill the 4.x.a version that is currently running.

                                    +
                                    +
                                    +
                                    +

                                    Killing the new 4.y.b Monitoring stack in testing mode

                                    +

                                    Use the following command to kill the containers:

                                    +
                                    ./kill-all.sh -p 9091 -g 3001 -m 9095
                                    +
                                    +
                                    +

                                    You can start and stop the new 4.y.b version while testing.

                                    +
                                    +
                                    +

                                    Move to version 4.y.b (the new version)

                                    +

                                    Note: migrating will cause a few seconds of blackout in the system.

                                    +

                                    We assume that you are using external volume to store the metrics data.

                                    +
                                    +

                                    Kill all containers

                                    +

                                    At this point you have two monitoring stacks running side by side, you should kill both before +continuing.

                                    +

                                    Kill the newer version that runs in testing mode by following the instructions on how to Killing the new 4.y.b Monitoring stack in testing mode +in the previous section

                                    +

                                    kill the older 4.x.a version containers by running:

                                    +
                                    ./kill-all.sh
                                    +
                                    +
                                    +

                                    Start version 4.y.b in normal mode

                                    +

                                    From the new root of the scylla-monitoring-scylla-monitoring-4.y.b run

                                    +
                                    ./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +

                                    Point your browser to http://{ip}:3000 and see that the data is there.

                                    +
                                    +
                                    +
                                    +

                                    Rollback to version 4.x.a

                                    +

                                    To rollback during the testing mode, follow Killing the new 4.y.b Monitoring stack in testing mode as explained previously +and the system will continue to operate normally.

                                    +

                                    To rollback to version 4.x.a after you completed the moving to version 4.y.b (as shown above). +Run:

                                    +
                                    ./kill-all.sh
                                    +cd /path/to/scylla-grafana-4.x.a/
                                    +./start-all.sh -d /path/to/data/dir
                                    +
                                    +
                                    +
                                    +
                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlAllowFiltering.html b/stable/use-monitoring/advisor/cqlAllowFiltering.html new file mode 100644 index 000000000..9c9dd6cbc --- /dev/null +++ b/stable/use-monitoring/advisor/cqlAllowFiltering.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Some queries use ALLOW FILTERING | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Some queries use ALLOW FILTERING

                                    +

                                    Scylla supports server-side data filtering that is not based on the primary key. This means Scylla would execute a full scan on the table: read all of the table’s data from disk, and then filter and return part of it to the user. More information on ALLOW FILTERING.

                                    +

                                    These kinds of queries can create a bigger load on Scylla, and should be used with care.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlCLAll.html b/stable/use-monitoring/advisor/cqlCLAll.html new file mode 100644 index 000000000..7e45f98e2 --- /dev/null +++ b/stable/use-monitoring/advisor/cqlCLAll.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ALL | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Some queries use Consistency Level: ALL

                                    +

                                    Scylla stores your data in ReplicationFactor of nodes (replicas). Typically, for a consistency level, each piece of information is stored in multiple replicas. A query’s Consistency Level determines how many replicas will need to be queried before a reply is returned.

                                    +

                                    Using consistency level ALL in a query requires all replicas to be available and will fail if a node is unavailable, resulting in reduced availability. This means that the client will not get a result in case one of the replicas is down or not responding, reducing the HA of the system.

                                    +

                                    Consistency level ALL should be used with care and should be accompanied with deep understanding and fall back mechanisms for node unavailability.

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlCLAny.html b/stable/use-monitoring/advisor/cqlCLAny.html new file mode 100644 index 000000000..85beaa0e9 --- /dev/null +++ b/stable/use-monitoring/advisor/cqlCLAny.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some queries use Consistency Level: ANY | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Some queries use Consistency Level: ANY

                                    +

                                    Scylla stores your data in ReplicationFactor of nodes (replicas). A write query Consistency Level determines how many replicas need to acknowledge the write before a reply is returned.

                                    +

                                    Using consistency level ANY allows a write query to be acknowledged after storing the information on the coordinator, a non-replica (as hints), meaning the data will be acknowledged when in fact it is not yet persistent on disk. Use Consistency Level ANY with care.

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlNoTokenAware.html b/stable/use-monitoring/advisor/cqlNoTokenAware.html new file mode 100644 index 000000000..5a4891f93 --- /dev/null +++ b/stable/use-monitoring/advisor/cqlNoTokenAware.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + Some queries are not token-aware | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Some queries are not token-aware

                                    +

                                    Scylla is a distributed database, with each node containing only part of the data. Ideally, a query would reach the node that holds the data (one of the replicas). Failing to do so would mean the coordinator will need to send the query internally to a replica, resulting in higher latency and more resource usage.

                                    +

                                    Typically, your driver would know how to route the queries to a replication node, but if you’re using non-prepared statements, a non-token-aware load-balance policy can cause the query to reach a node that is not a replica.

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlNonPaged.html b/stable/use-monitoring/advisor/cqlNonPaged.html new file mode 100644 index 000000000..c94647337 --- /dev/null +++ b/stable/use-monitoring/advisor/cqlNonPaged.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + Some SELECT queries are non-paged | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Some SELECT queries are non-paged

                                    +

                                    By default, read queries are paged, this means that Scylla breaks the results into multiple chunks (pages) limiting the reply size. Non-Paged queries require all results to be returned in one reply increasing the overall load on Scylla. Thus, drivers and clients should avoid sending these queries.

                                    +
                                    +

                                    Blog-post Links

                                    +

                                    https://www.scylladb.com/2018/07/13/efficient-query-paging/

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlNonPrepared.html b/stable/use-monitoring/advisor/cqlNonPrepared.html new file mode 100644 index 000000000..f4f9c6eef --- /dev/null +++ b/stable/use-monitoring/advisor/cqlNonPrepared.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Some queries are non-prepared | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Some queries are non-prepared

                                    +

                                    Prepared Statements are an optimization that allows parsing a query only once and executing it multiple times with different concrete values. +As a rule of thumb, you should always favor prepared statements.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/cqlReverseOrder.html b/stable/use-monitoring/advisor/cqlReverseOrder.html new file mode 100644 index 000000000..653135154 --- /dev/null +++ b/stable/use-monitoring/advisor/cqlReverseOrder.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/heavyCompaction.html b/stable/use-monitoring/advisor/heavyCompaction.html new file mode 100644 index 000000000..65f344524 --- /dev/null +++ b/stable/use-monitoring/advisor/heavyCompaction.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + Compaction takes lots of memory and CPU | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Compaction takes lots of memory and CPU

                                    +

                                    ScyllaDB runs compaction periodically as a background process. While running compaction is important, there are situations when +compaction takes too much CPU. +As a result, compaction impacts the overall system performance.

                                    +

                                    If this is the case, you can do one of the following:

                                    +
                                      +
                                    • Statically limit the compaction shares with the compaction_static_shares option by setting a value between 50 and 1000:

                                      +
                                      +
                                        +
                                      • In the scylla.yml configuration file: compaction_static_shares: 100

                                      • +
                                      • In the command line when starting ScyllaDB: --compaction-static-shares 100

                                      • +
                                      +
                                      +

                                      You may start by setting the value 100. If read latency is impacted, which indicates that compaction is overly slowed down, +you can increase the value to reach the balance between the system performance and read latency.

                                      +
                                    • +
                                    • Enforce min_threshold by setting compaction_enforce_min_threshold: true in the scylla.yml configuration file. +As a result, ScyllaDB will compact only the buckets that contain the number of SSTables specified with min_threshold +or more. See STCS options for details.

                                    • +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/index.html b/stable/use-monitoring/advisor/index.html new file mode 100644 index 000000000..f58b5bf01 --- /dev/null +++ b/stable/use-monitoring/advisor/index.html @@ -0,0 +1,694 @@ + + + + + + + + + + + + + Scylla Monitoring Stack Advisor | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Scylla Monitoring Stack Advisor

                                    +
                                    +
                                    +

                                    The Scylla Monitoring Stack Advisor is an element of the Scylla Monitoring Stack that recognizes bad practices, bad configurations, and potential problems and advises on how to solve them.

                                    +
                                    +

                                    The Advisor section

                                    +
                                    +../../_images/advisor_panel.png +
                                    +

                                    The Advisor section

                                    +
                                    +
                                    +

                                    The Advisor section is located on the Overview dashboard and holds the Advisor issues table. Each issue has a category, a link to jump to a relevant dashboard, and a description of the issue.

                                    +

                                    For example, the Advisor could warn about using large cells. Large cells in the data usually indicate a problem with the data model or a problem with the client code, and can impact system performance.

                                    +

                                    Each Advisor issue is explained in detail:

                                    + +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/nodeCLErrors.html b/stable/use-monitoring/advisor/nodeCLErrors.html new file mode 100644 index 000000000..4c5445b5b --- /dev/null +++ b/stable/use-monitoring/advisor/nodeCLErrors.html @@ -0,0 +1,665 @@ + + + + + + + + + + + + + Some operation failed due to unsatisfied consistency level | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Some operation failed due to unsatisfied consistency level

                                    +

                                    ScyllaDB uses data replication, which means that a query is sent to a coordinator node sends the query to the replica nodes (the nodes that hold and persist the replicated data). The coordinator collects the replies and returns an answer. A query Consistency Level, determines the number of replicas that must reply before the coordinator returns an answer.

                                    +

                                    For example, if the data is replicated to 3 nodes (AKA replication factor 3) and the Consistency Level is quorum, the coordinator will wait for 2 replies before returning the answer.

                                    +

                                    When one or more nodes are down or unreachable, the Coordinator may fail with a Consistency Level Error because it cannot reach the required consistency level.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/nodeIOErrors.html b/stable/use-monitoring/advisor/nodeIOErrors.html new file mode 100644 index 000000000..fb30d0fde --- /dev/null +++ b/stable/use-monitoring/advisor/nodeIOErrors.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + I/O Errors can indicate a node with a faulty disk | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    I/O Errors can indicate a node with a faulty disk

                                    +

                                    I/O Errors are errors that originate from the hardware, most likely from a faulty disk. If this occurs, check the specific node’s hardware.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/nodeLocalErrors.html b/stable/use-monitoring/advisor/nodeLocalErrors.html new file mode 100644 index 000000000..3b303dcb2 --- /dev/null +++ b/stable/use-monitoring/advisor/nodeLocalErrors.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + Some operations failed on the replica side | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Some operations failed on the replica side

                                    +

                                    ScyllaDB uses data replication, which means that a query that is sent to a coordinator node sends the query to the replica nodes (the nodes that actually hold the replicated data). The coordinator then collects the replies and returns an answer.

                                    +

                                    An error on the replica side means that data failed to be persistent on that node, leaving data at risk. Check the node to identify the reasons for the errors.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/nonBalancedcqlTraffic.html b/stable/use-monitoring/advisor/nonBalancedcqlTraffic.html new file mode 100644 index 000000000..0a11919eb --- /dev/null +++ b/stable/use-monitoring/advisor/nonBalancedcqlTraffic.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + CQL queries are not balanced among shards | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    CQL queries are not balanced among shards

                                    +

                                    For optimal performance, data and queries should be distributed evenly across nodes and shards. If some shards are getting more traffic they could become a bottleneck for Scylla.

                                    +

                                    There could be multiple explanations for these performance issues: data-model, non-prepared statement, or driver.

                                    +
                                    +

                                    Blog post link

                                    +

                                    https://www.scylladb.com/2019/08/20/best-practices-for-data-modeling/

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/preparedCacheEviction.html b/stable/use-monitoring/advisor/preparedCacheEviction.html new file mode 100644 index 000000000..e628ca3e1 --- /dev/null +++ b/stable/use-monitoring/advisor/preparedCacheEviction.html @@ -0,0 +1,669 @@ + + + + + + + + + + + + + Prepared statements cache eviction | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    Prepared statements cache eviction

                                    +

                                    Typically, prepared statements are prepared once and then used for a long period. Prepared statements are stored in the cache and only get evicted if they are not used. +If the prepared statements cache does get evicted, it’s an indication that something is wrong. +The two main sources are:

                                    +
                                      +
                                    • A prepared statement that contains a field value, creating such a statement will result in a new prepared statement being stored each time, which defies the purpose of it.

                                    • +
                                    • The prepared statements cache might be too small for the number of prepared statements.

                                    • +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/advisor/systemOverload.html b/stable/use-monitoring/advisor/systemOverload.html new file mode 100644 index 000000000..514a1b833 --- /dev/null +++ b/stable/use-monitoring/advisor/systemOverload.html @@ -0,0 +1,670 @@ + + + + + + + + + + + + + System Overload | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    System Overload

                                    +

                                    There could be multiple indications that a system is overloaded:

                                    +
                                      +
                                    • Timeouts

                                    • +
                                    • Requests shed - Requests are shed (dropped) when the system cannot process requests fast enough.

                                    • +
                                    • CPU at 100% when no background process (like compaction or repair) runs.

                                    • +
                                    • Queues are getting filled.

                                    • +
                                    +

                                    If you ruled out data-model problems and hardware failure, this could indicate you need to scale the system.

                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/cql-optimization.html b/stable/use-monitoring/cql-optimization.html new file mode 100644 index 000000000..b812f9d81 --- /dev/null +++ b/stable/use-monitoring/cql-optimization.html @@ -0,0 +1,786 @@ + + + + + + + + + + + + + The CQL Optimization | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + + + +
                                    +

                                    The CQL Optimization

                                    +

                                    The CQL Optimization is part of the CQL Dashboard and is a tool to help identify potential issues with queries, data model and driver.

                                    +
                                    +../_images/cql_optimization_master.png +
                                    +

                                    The CQL Dashboard

                                    +
                                    +
                                    +

                                    The upper part of the dashboard holds CQL related metrics.

                                    +

                                    The lower parts holds gauges and graphs. When inspecting the system, we like the gauge to be near zero and the graphs as low as possible.

                                    +
                                    +

                                    Note

                                    +

                                    Besides your queries, there are queries generated by the cql driver and internal queries to the system tables which can be misleading when testing with low traffic.

                                    +
                                    +

                                    The following sections describe each of the dashboard’s panel

                                    +
                                    +

                                    Prepared Statements

                                    +

                                    Prepared statements are queries that are first defined as a template with place holders for the values and then that template is used +multiple times with different values.

                                    +

                                    Using prepared statements has the following benefits:

                                    +
                                      +
                                    • The database only needs to parse the query once

                                    • +
                                    • The driver can route the query to the right node

                                    • +
                                    • Using place-holders and values is safer and prevents CQL-Injection

                                    • +
                                    +

                                    The CQL Non-Prepared Queries Gauge shows the percentage of queries that are not prepared.

                                    +

                                    The CQL Non-Prepared Queries Graph shows the rate of the queries. Make sure both are low.

                                    +
                                    +
                                    +

                                    Token Aware

                                    +

                                    Scylla is a distributed database, where each node contains only part of the data, specifically a range of the token ring. +Ideally, a query would reach the node that holds the data (one of the replicas), failing to do so would mean the coordinator +needs to send the query internally to a replica. This results in higher latency and increased resource usage.

                                    +

                                    Typically, your driver would know how to route the queries to a replication node, but using non-prepared statements, non-token-aware driver +or load-balance can cause the query to reach a node that is not a replica.

                                    +

                                    The Non-Token Aware Gauge shows the percentage of queries that reached a node that does not hold that data (a node that is not a replica-node).

                                    +

                                    The Non-Token Aware Queries Graph shows the rate of the queries that did not reach a replica-node, make sure both are low.

                                    +
                                    +
                                    +

                                    Paged Queries

                                    +

                                    By default, read queries are paged, this means that Scylla will break the results into multiple chunks limiting the reply size. +Non-Paged queries require all results be returned in one result increasing the overall load of the system and clients and should be avoided.

                                    +

                                    The Non-Paged CQL Reads Gauge shows the percentage of non-paged read queries that did not use paging.

                                    +

                                    The Non-Paged CQL Reads Graph shows the rate of the non-paged queries, make sure both are low.

                                    +
                                    +
                                    +

                                    Reversed CQL Reads

                                    +

                                    ScyllaDB supports compound primary keys with a clustering column. This kind of primary keys allows an efficient way +to return sorted results that are sorted by the clustering column.

                                    +

                                    We strongly recommend using use the correct ordering. +Querying with an order different than the order the CLUSTERING ORDER BY was defined is supported, but not advisable.

                                    +

                                    For example, look at the following table:

                                    +
                                    CREATE TABLE ks1.table_demo (
                                    +   category text,
                                    +   type int,
                                    +   PRIMARY KEY (category, type))
                                    +WITH CLUSTERING ORDER BY (type DESC);
                                    +
                                    +
                                    +

                                    The following query uses reverse order:

                                    +
                                    select * from ks1.table_demo where category='cat1' order by type ASC;
                                    +
                                    +
                                    +

                                    The Reversed CQL Reads Gauge shows the percentage of read queries that use ORDER BY that is different than the CLUSTERING ORDER BY.

                                    +

                                    The Reversed CQL Reads Graph shows the rate of the read queries that use ORDER BY that is different than the CLUSTERING ORDER BY, make sure both are low.

                                    +
                                    +
                                    +

                                    ALLOW FILTERING

                                    +

                                    Scylla supports server side data filtering that is not based on the primary key. This means Scylla would read data and then filter and +return part of it to the user. Data that is read and then filtered is an overhead to the system.

                                    +

                                    These kinds of queries can create a big load on the system, and should be used with care.

                                    +

                                    The CQL optimization dashboard, checks for two things related to queries that use ALLOW FILTERING: how many such queries exist; and how much of the data that was read was +dropped before returning to the client.

                                    +

                                    The ALLOW FILTERING CQL Reads Gauge shows the percentage of read queries that use ALLOW FILTERING.

                                    +

                                    The ALLOW FILTERING CQL Reads Graph shows the rate of the read queries that use ALLOW FILTERING, make sure both are low.

                                    +

                                    The ALLOW FILTERING Filtered Rows Gauge shows the percentage of rows that were read and then filtered, this is an indication of the additional overhead to the system.

                                    +

                                    The ALLOW FILTERING Filtered Rows Graph shows multiple graphs: the rows that were read, the rows that matched and the rows that were dropped. Rows that +were dropped are an additional overhead to the system.

                                    +
                                    +
                                    +

                                    Consistency Level

                                    +

                                    Typically data in Scylla is duplicated into multiple replicas for availability reasons. A coordinator node would get the request and will send it +to the nodes holding the replicas.

                                    +

                                    The query Consistency Level determines how many replies from the replicas are required before the coordinator replies to the client. +The most common case is to use QUORUM, which means that when the coordinator gets a majority of the replies from the replicas, it will return success to the client.

                                    +

                                    Two consistency levels hold a potential problem and should be used with care ANY and ALL.

                                    +

                                    The CQL ANY Queries Gauge shows the percentage of queries that use Consistency Level ANY. Using consistency level ANY in a query may hurt persistency, if the node receiving the request fails, the data may be lost.

                                    +

                                    The CQL ANY CL Queries Graph shows the rate of the queries that use Consistency Level ANY, make sure both are low.

                                    +

                                    The CQL ALL CL Queries Gauge shows the percentage of queries that use Consistency Level ALL. Using consistency level ALL in a query may hurt availability, if a node is unavailable the operations will fail.

                                    +

                                    The CQL ALL CL Queries Graph shows the rate of the queries that use Consistency Level ALL, make sure both are low.

                                    +
                                    +
                                    +

                                    Cross DC

                                    +

                                    Cross DC traffic is usually more expensive in terms of latencies and cost. +This metric reports on such traffic in situations were it could be avoided.

                                    +
                                    +
                                    +

                                    Cross DC Consistency Level

                                    +

                                    Using consistency level QUORUM or consistency level ONE in a query when there is more than one DC may hurt performance, +as queries may end in the non-local DC. Use LOCAL_QUORUM and LOCAL_ONE instead.

                                    +
                                    +
                                    +

                                    Cross DC read requests

                                    +
                                    +

                                    Note

                                    +

                                    The CQL Optimization Dashboard relies on the definition of nodes per Data Center in the Scylla Monitoring Stack (prometheus/scylla_servers.yml) to match the Data Center names used in Scylla Cluster. +If this is not the case, you will see the wrong result.

                                    +
                                    +

                                    In a typical situation, a client performs a read from the nearest data-center and that query is performed local to the data-center. +A read request that ends up causing traffic between data-centers adds additional overhead to the system.

                                    +

                                    The Cross DC read requests Gauge shows the percentage of read queries that caused a request to an external data-center, make sure it is low or zero.

                                    +
                                    +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/cql_optimization.html b/stable/use-monitoring/cql_optimization.html new file mode 100644 index 000000000..c1280fe53 --- /dev/null +++ b/stable/use-monitoring/cql_optimization.html @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/stable/use-monitoring/index.html b/stable/use-monitoring/index.html new file mode 100644 index 000000000..1e43eab90 --- /dev/null +++ b/stable/use-monitoring/index.html @@ -0,0 +1,656 @@ + + + + + + + + + + + + + Using Scylla Monitoring Stack | ScyllaDB Docs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + +
                                    +
                                    + Menu +
                                    +
                                    +
                                    +
                                    +
                                    + + + + +
                                    + +
                                    + +
                                    +

                                    Using Scylla Monitoring Stack

                                    +
                                    +
                                    +

                                    There are several dashboards you can use with Scylla Monitoring Stack. Choose a topic to begin:

                                    + +
                                    + + +
                                    + + + + + + + +
                                    + +
                                    + + + + +
                                    + + + + + + + \ No newline at end of file